我有一个列向量和一个行向量。
http://mysite.ru/#!/order/
我希望将a = [1;2;3]
b = [10 20 30 40 50 60 70 80 90]
切换为b
,[10 20 30]
,[40 50 60]
并创建一个单元格数组C
这样
[70 80 90]
没有for循环。如何在MATLAB中实现?
我也希望有
C{1} = a*[10 20 30]
C{2} = a*[40 50 60]
C{3} = a*[70 80 90]
这样
a = [1;2;3]
b = [10 20 30 40 50 60 70 80 90 100 110 120]
P.S。如果这不可能,如何创建一个3维数组D
C{1} = a*[10 20 30]
C{2} = a*[40 50 60]
C{3} = a*[70 80 90]
C{4} = a*[100 110 120]
没有for循环?
我也希望有
D(:,:,1) = a*[10 20 30]
D(:,:,2) = a*[40 50 60]
D(:,:,3) = a*[70 80 90]
这样
a = [1;2;3]
b = [10 20 30 40 50 60 70 80 90 100 110 120]
答案 0 :(得分:1)
性能方面,3D矩阵肯定是超越单元阵列的更好选择!首先,您可以使用permute
将a
转换为第3维和reshape
以获得所需的矩阵基本形状(根据您的实际情况进行编辑)。最后,您需要bsxfun
来执行实际的乘法。
n = 3;
a = [1;2;3]
b = [10 20 30 40 50 60 70 80 90 100 110 120]
%// permuting a to 3rd dimension
A = permute(a,[2,3,1])
%// reshaping b
B = reshape(b.', [], n)
%// multiplication and forming of 3D-array
out = bsxfun(@mtimes,B,A)
out(:,:,1) =
10 50 90
20 60 100
30 70 110
40 80 120
out(:,:,2) =
20 100 180
40 120 200
60 140 220
80 160 240
out(:,:,3) =
30 150 270
60 180 300
90 210 330
120 240 360
替代解决方案,取决于解释:
%// reshaping and permuting b
B = permute(reshape(b.', n, []),[3,1,2])
%// multiplication and forming of 3D-array
out = bsxfun(@mtimes,B,a)
out(:,:,1) =
10 20 30
20 40 60
30 60 90
out(:,:,2) =
40 50 60
80 100 120
120 150 180
out(:,:,3) =
70 80 90
140 160 180
210 240 270
out(:,:,4) =
100 110 120
200 220 240
300 330 360
答案 1 :(得分:0)
如the other answer中所述,使用3个维度肯定会给您带来更好的表现。然而,由于问题是关于细胞,我将提供一些技巧如何使用细胞来处理它。
a = [1;2;3]; % userdata
b = [10 20 30 40 50 60 70 80 90,100,110,120]; % userdata
B = reshape(b,length(b)/3,3).'; % reshape b to 3-by-3 matrix and transpose
carr = mat2cell(B,[1,1,1],3); % split each row to a cell
res = cellfun(@(x) mtimes(a,x) ,carr, 'un',0); % for every cell multiplicate with a
所以更喜欢3D矩阵,但如果你想要细胞,就是它。
修改强>
对于包含b-by-3矩阵的任意数量的单元格,可以使用以下内容。
a = [1;2;3];
b = [10 20 30 40 50 60 70 80 90,100,110,120];
ncells = length(b)/3;
B = reshape(b,3,ncells).';
carr = mat2cell(B,ones(1,ncells),3);
res = cellfun(@(x) mtimes(a,x) ,carr, 'un',0);
res{:}
建议您使用debugger逐步执行代码并调查reshape
和mat2cell
的工作原理。这样就可以根据需要自定义此代码。