seth_not@home: matlab

gudn tach!

ich moechte einen block in einer n-dimensionalen matrix mit einsen fuellen (der rest soll aus nullen bestehen).

im zwei-dimensionalen wuerde das z.b. so aussehen:

A=zeros(4,5);

A=
  0  0  0  0  0
  0  0  0  0  0
  0  0  0  0  0
  0  0  0  0  0

A(1:3, 1:2)=ones(3, 2);
% oder kuerzer:
A(1:3, 1:2)=1;

A=
  1  1  0  0  0
  1  1  0  0  0
  1  1  0  0  0
  0  0  0  0  0

der block, der auf 1 gesetzt werden soll, wird durch den vektor v bestimmt, also z.b.
v=[3,2];
A(1:v(1), 1:v(2))=1;

das ist schon fast gut. es ist allerdings so, dass v nicht immer die gleiche laenge hat. ich will aber nicht immer den quelltext aendern, wenn sich v in der lange aendert. ebensowenig will ich den kram als string zusammenstueckeln und eval benutzen.

ich wuerde gerne sowas schreiben wie
A(v)=1;
oder
A(1:v)=1;
oder sowas, aber das macht etwas voellig anderes als ich moechte.

bietet matlab da was fertiges zu an? falls ja, was?

wenn gar nix hilft, muss ich den kram halt von hand in irgendwelche dicken schleifen packen. aber da habe ich keine lust drauf, weil ich befuerchte, dass dabei mein kopf platzen koennte.

prost
seth

  1. Hallo seth_not@home,

    das ist schon fast gut. es ist allerdings so, dass v nicht immer die gleiche laenge hat.

    Wie könnte v, der ja bei Dir Zeile x Spalte des "Blocks" entspricht, noch aussehen? Wie soll v = [1 3 6]' berücksichtigt werden?

    Um Dein bisheriges Beispiel zu erzeugen würde:

    A([1:v(1)],[1:v(2)])=1

    gehen.

    [1:v(1)] (die Kurzform von [1:1:v(1)] erzeugt dabei einen Vector mit der Länge des ersten Wertes von v, indem nur 1en drin stehen - analoges gilt für [1:v(2)]

    ebensowenig will ich den kram als string zusammenstueckeln und eval benutzen.

    dazu sollte Dir ggf. num2str helfen...

    Mit freundlichem Gruß
    Micha

    --
    LeagueEditor JavaScript :: simple Ligaverwaltung auf der Basis von JavaScript || JS Tetris :: für zwischendurch
    1. gudn tach Micha!

      das ist schon fast gut. es ist allerdings so, dass v nicht immer die gleiche laenge hat.
      Wie könnte v, der ja bei Dir Zeile x Spalte des "Blocks" entspricht, noch aussehen? Wie soll v = [1 3 6]' berücksichtigt werden?

      wenn A eine 3-dimensionale matrix ist, dann wuerde v einen 3-d-block symbolisieren. (wobei es hier nur eine flaeche waere, da v(1)==1.)

      mathematisch formuliert gilt:
      [latex]v=(p_1,p_2,\ldots,p_n)\in\mathbb R^n[/latex]
      [latex]A\in\mathbb R^{m_1\times m_2\times\ldots\times m_n}[/latex]
      wobei[latex]p_i\le m_i\ \forall i\in{1,\ldots,n}[/latex].
      und [latex]A[/latex] soll so konstruiert werden, dass gilt:
      [latex]A(q_1,\ldots,q_n)=1[/latex], falls [latex]q_i\le p_i\ \forall i\in{1,\ldots,n}[/latex] sowie
      [latex]A(q_1,\ldots,q_n)=0[/latex], falls [latex]q_i>p_i[/latex] fuer mind. ein [latex]i\in{1,\ldots,n}[/latex].

      das problem fuer mich in matlab sind die drei puenktchen.

      Um Dein bisheriges Beispiel zu erzeugen würde:

      A([1:v(1)],[1:v(2)])=1

      gehen.

      ja, wenn v die laenge 2 hat. aber die laenge von v kann auch mal 3, 5 oder 78 (oder was ganz anderes) sein.

      ebensowenig will ich den kram als string zusammenstueckeln und eval benutzen.

      dazu sollte Dir ggf. num2str helfen...

      mit zusammenstueckeln meinte ich, dass ich in einer schleife sowas wie
      'A(1:v(1),1:v(2),1:v(3),1:v(4),1:v(5))=1;' basteln wuerde. das geht zwar, ist jedoch sehr lahm in der ausfuehrung und nicht huebsch.

      prost
      seth

      1. Hallo seth,

        Wie könnte v, der ja bei Dir Zeile x Spalte des "Blocks" entspricht, noch aussehen? Wie soll v = [1 3 6]' berücksichtigt werden?

        wenn A eine 3-dimensionale matrix ist, dann wuerde v einen 3-d-block symbolisieren. (wobei es hier nur eine flaeche waere, da v(1)==1.)

        Ich merke gerade, dass ich zukünftig nicht einfach wahllos auf den Num-Block drücken sollte - schlecht gewähltes Beipsiel meinerseits - aber ich habe es verstanden

        mit zusammenstueckeln meinte ich, dass ich in einer schleife sowas wie
        'A(1:v(1),1:v(2),1:v(3),1:v(4),1:v(5))=1;' basteln wuerde. das geht zwar, ist jedoch sehr lahm in der ausfuehrung und nicht huebsch.

        Ja, das ist nun, nachdem ich Dein Problem vollständig erfasst habe, auch mein bisher einziger Ansatz. :/

        Mit freundlichem Gruß
        Micha

        --
        LeagueEditor JavaScript :: simple Ligaverwaltung auf der Basis von JavaScript || JS Tetris :: für zwischendurch
        1. gudn tach!

          mit zusammenstueckeln meinte ich, dass ich in einer schleife sowas wie
          'A(1:v(1),1:v(2),1:v(3),1:v(4),1:v(5))=1;' basteln wuerde. das geht zwar, ist jedoch sehr lahm in der ausfuehrung und nicht huebsch.

          Ja, das ist nun, nachdem ich Dein Problem vollständig erfasst habe, auch mein bisher einziger Ansatz. :/

          ich habe es nun, weil ich damit fertig werden wollte, ueber folgenden algorithmus geloest:

          % gegeben:
          % v, z.b. [2 3 2 2 4 2]
          % dims_A = ausdehnungen von A, z.b.  [5 2 6 2 6 3]
          dim_A  = length(dims_A); % dimension von A (also auch von v), z.b. 6
          size_A = prod(dims_A);   % anzahl der elemente von A
          A      = zeros(dims_A);  % erzeuge matrix, setze alles null
          ind    = ones(dim_A, 1); % index des ersten elements in der matrix A
          for j=1:size_A           % schleife ueber alle matrixkomponenten
            if(ind<=v)             % komponentenweiser vergleich
              A(j) = 1;            % setze ggf. 1
            end
            ind(1) = ind(1)+1;     % naechstes element
            % pruefe, ob uebertrag; uebertrage ggf.
            for k=1:length(ind)    % schleife ueber alle komponenten des index-vektors
              temp_diff = dims_A(k)-ind(k); % pruefe, ob index ueberhaupt existiert
              if(temp_diff<0)      % falls nicht, ist ein uebertrag vorhanden
                ind(k) = 1;        % setze aktuelle komponente des index-vektors zurueck
                if(k<length(ind))  % und uebertrage ueberhang auf naechste komponente
                  ind(k+1) = ind(k+1)-temp_diff;
                else
                  error('aaah, out of range, das darf noch nedd sein!');
                end
              end
            end
            clear temp_diff;
          end

          prost
          seth