我想要显示2dim。表面图用于matlab中3维或更高维数组的2个参数的不同组合。整合未示出的尺寸的数据(即,在剩余的尺寸中求和)。我正在使用surf()
,并且对于(1,2)以外的参数组合(例如。(1,3),(2,3)......)我必须重新排列数据矩阵才能使它成为现实工作
我正在寻找替代命令(或更短的代码)来完成这项工作。
以下是代码:
a=zeros(3,3,2);
a(:,:,1) = [1 2 3 ;4 5 6; 7 8 9; 10 11 12]; % // data matrix
a(:,:,2) = -[1 2 3 ;4 5 6; 7 8 9; 10 11 12]*2; % // data matrix
ai=[[1 2 3 4]' [5 6 7 0]' [8 9 0 0]']; % // parameter vector
mat12 = sum(a,3);
surf(ai(1:3,2),ai(1:4,1),mat12)
aux13 = sum(a,2);
for i = 1:2; mat13(:,i) = aux13(:,:,i);
surf(ai(1:2,3),ai(1:4,1),mat13)
aux23 = sum(a,1);
for i = 1:2; mat23(i,:) = aux23(:,:,i);
surf(ai(1:3,2),ai(1:2,3),mat23)
换句话说,我正在寻找一种方法,使用surf
表示矩阵mat13
和mat23
,而不使用aux13
,aux23
变量和{ {1}}循环。
答案 0 :(得分:1)
首先你的例子没有运行,因为你将a=zeros(3,3,2);
声明为矩阵[3x3x2]但你立即尝试将其填充为[4x3x2]矩阵,所以我必须将你的第一行调整为:{{ 1}}
如果我使用该调整运行代码,则辅助变量和a=zeros(4,3,2);
循环将重构/重塑一个剥离其单一维度的矩阵。 Matlab为此提供了一个方便的功能:squeeze
。
例如,您的变量for
具有维度[4x1x2],然后aux13
实现与mat13=squeeze(aux13);
循环相同的功能。您的矩阵for
现在具有维度[4x2]。
由于不需要mat13
循环,您可以直接在求和结果上调用for
来完全绕过辅助变量:squeeze
完整示例,下面的代码与您的代码示例完全相同:
mat13=squeeze( sum(a,2) );
请注意,我必须转置mat12 = sum(a,3);
surf(ai(1:3,2),ai(1:4,1),mat12)
mat13 = squeeze( sum(a,2) ) ;
surf(ai(1:2,3),ai(1:4,1),mat13)
mat23 = squeeze( sum(a,1) ) ;
mat23 = mat23.' ; %'// <= note the "transpose" operation here
surf(ai(1:3,2),ai(1:2,3),mat23)
以使其与示例中的匹配。
mat23
是[1x3x2] =&gt;挤压它,你得到一个[3x2]矩阵,但你的代码在[2x3]矩阵中排列相同的值,所以使用transpose
。 sum(a,1)
运算符使用简写符号transpose
。
我在一个单独的行中使用它只是为了突出显示它。一旦理解,您只需在一行中编写完整的操作:
.'
答案 1 :(得分:0)
编写循环的方式并不完全是MATLAB语法。下面是显示的正确循环语法。 在第2行和第3行,您尝试将(4x3) - 矩阵加载到(3x3) - 矩阵中。这就是你得到下标错误的原因。您可以通过使零 - 矩阵更大来解决它。这里修改了一些语法:
a=zeros(4,3,2);
a(:,:,1) = [1 2 3 ;4 5 6; 7 8 9; 10 11 12]; % // data matrix
a(:,:,2) = -[1 2 3 ;4 5 6; 7 8 9; 10 11 12]*2; % // data matrix
ai=[[1 2 3 4]' [5 6 7 0]' [8 9 0 0]']; % // parameter vector
mat12 = sum(a,3);
surf(ai(1:3,2),ai(1:4,1),mat12)
aux13 = sum(a,2);
for i = 1:2 mat13(:,i) = aux13(:,:,i);
surf(ai(1:2,3),ai(1:4,1),mat13)
end
aux23 = sum(a,1);
for i = 1:2 mat23(i,:) = aux23(:,:,i);
surf(ai(1:3,2),ai(1:2,3),mat23)
end
现在,你在这些循环中想要做什么?