2016-07-12 6 views
0

Ich habe eine 3D MATLAB-Funktion.Jede Schicht eines MATLAB 3D-Arrays durch eine andere Nummer teilen

Ich möchte jede Scheibe der Matrix mit einer anderen Nummer multiplizieren.

I versucht, dies im folgenden Beispiel Code durch bsxfun zu implementieren:

a=randi(10,4,3,2); 
b=[2 3]; 
c=bsxfun(@times,a,b) 

ich, dass die ersten 4 * 3 Stück von 'a' mit 2 multipliziert würde bestimmt, und der zweite 4 * 3 slice von 'a' würde jedoch von 3.

multipliziert werden, ich folgende Fehlermeldung nur bekam:

??? Fehler bei Verwendung von ==> bsxfun Nicht-Singleton-Dimensionen der beiden Eingangsarrays müssen übereinstimmen.

Wie löst man das Problem, ohne eine Schleife zu verwenden?

Antwort

3

Wie der Fehler sagt, müssen Sie die Abmessungen des Vektors und der Matrix übereinstimmen. Da b ein Zeilenvektor ist, können Sie die Segmente der Matrix in Spalten umwandeln. Sie können dies tun, mit permute:

a = randi(10, 4, 3, 2); 
b = [2 3]; 
ap = permute(a, [1 3 2]); 
c = bsxfun(@times, ap, b) 

Dann das Ergebnis Matrix wieder in die richtige Form zu bringen, müssen Sie sich erneut permutieren. Sie können entweder die richtige Permutationsreihenfolge herausfinden (in diesem Fall ist es dieselbe, d. H. [1 3 2]) oder Sie können ipermute (inverse Permute) verwenden und es für Sie herausfinden lassen. Gib es einfach die gleiche Permutationsreihenfolge, die du vorher permute gegeben hast.

c = ipermute(c, [1 3 2]); 

Alternativ können Sie den Vektor b permutieren die richtige Form zu sein, um die Scheiben zu multiplizieren, indem sie sie erstrecken sich in der dritten Dimension zu machen:

a = randi(10, 4, 3, 2); 
b = [2 3]; 
bp = permute(b, [1 3 2]); 
c = bsxfun(@times, a, bp) 

In diesem Fall, da wir nicht ändern a müssen wir c nicht erneut permutieren, um die richtige Form zu erhalten.

Verwandte Themen