可视化n-dim的二维图。数组通过matlab中的surf()

时间:2015-01-17 11:06:51

标签: matlab

我想要显示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表示矩阵mat13mat23,而不使用aux13aux23变量和{ {1}}循环。

2 个答案:

答案 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]矩阵中排列相同的值,所以使用transposesum(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

现在,你在这些循环中想要做什么?