可视化 n-dim 的 2D 图。在 matlab 中通过 surf() 数组

visualizing 2D-graphs of n-dim. array via surf() in 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 变量和for 循环。

您编写循环的方式不完全是 MATLAB 语法。下面是显示的正确循环语法。 在第 2 行和第 3 行,您试图将 (4x3) 矩阵加载到 (3x3) 矩阵中。这就是你得到下标错误的原因。您可以通过增大 zeros-matrix 来解决它。这是一些固定的语法:

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

现在,您到底想在这些循环中做什么?

首先,您的示例没有 运行,因为您将 a=zeros(3,3,2); 声明为矩阵 [3x3x2],但您立即尝试将其填充为 [4x3x2] 矩阵,因此我不得不调整您的第一行:a=zeros(4,3,2);

如果我 运行 您的代码进行了该调整,您的辅助变量和 for 循环将成为 reform/reshape 剥离其单一维度的矩阵。 Matlab 为此提供了一个方便的函数:squeeze.

例如,您的变量 aux13 的维度是 [4x1x2],那么 mat13=squeeze(aux13); 实现的效果与您的 for 循环相同。您的矩阵 mat13 现在的维度是 [4x2]。

由于不需要 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 以使其与您的示例中的匹配。

sum(a,1) 是 [1x3x2] => 挤压它,你会得到一个 [3x2] 矩阵,但是你的代码在 [2x3] 矩阵中排列相同的值,所以使用 transpose . transpose 运算符具有 shorthand 表示法 .'.

我在示例中单独一行使用它只是为了突出显示它。一旦理解,您可以简单地将完整的操作写在一行中:

mat23 = squeeze(sum(a,1)).' ;