可视化 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
用于矩阵 mat13
和 mat23
而无需 aux13
、aux23
变量和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)).' ;
我想显示 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
变量和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)).' ;