可视化n维二维图形。matlab中通过surf()实现的数组

可视化n维二维图形。matlab中通过surf()实现的数组,matlab,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(:,

我想展示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) 

换句话说,我正在寻找一种方法,在矩阵
mat13
mat23
中使用
surf
,而不使用
aux13
aux23
变量和
for
循环。

编写循环的方式并不完全是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

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

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

如果我用这个调整运行你的代码,你的辅助变量和
循环的将改革/重塑一个去掉了单子维度的矩阵。Matlab提供了一个方便的函数:

例如,变量
aux13
的维度为[4x1x2],然后
mat13=squence(aux13)实现与
for
循环相同的功能。您的矩阵
mat13
现在是维度[4x2]

由于不需要
for
循环,您可以通过直接对求和结果调用
squence
来完全绕过辅助变量:
mat13=squence(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)

这正是我需要的。非常感谢(甚至这个词也不鼓励在这里的方框中使用…;-)。为什么在转置符号“.”之前加一个点?“我认为这是没有必要的。”未来主义者。谢谢你的反馈。如果你正在寻找答案,你可以考虑接受答案(答案旁边的绿色刻痕)。真正的“转置”操作快捷方式是
,我们鼓励您使用此快捷方式。简单的
操作符将为您提供向量的“复共轭”。对于只包含实数的向量/矩阵(如您的例子),它看起来像是相同的运算,但是如果您必须处理复数,如果您使用错误的运算符,它将弄乱您的结果。谢谢,请更正第一行应如您所述;还有两个“end”语句丢失,但是,它们应该在最后两个“surf”命令之前,分别是。请看上面的答案。
mat23 = squeeze(sum(a,1)).' ;