hak*_*anc 3 matlab multidimensional-array
对于维度等于或小于 2 的矩阵,命令是:
例如:
>> mat2str(ones(2,2))
ans =
[1 1;1 1]
Run Code Online (Sandbox Code Playgroud)
但是,正如帮助所述,这不适用于更高的维度:
>> mat2str(rand(2,2,2))
Error using mat2str (line 49)
Input matrix must be 2-D.
Run Code Online (Sandbox Code Playgroud)
如何输出维数高于 2 且代码兼容的矩阵,而不求助于定制的 for 循环?
这不是直接可能的,因为没有内置字符来表示第三维中的连接(类似于 2D 中的逗号和分号)。一种可能的解决方法是mat2str在第三维中的所有“切片”上执行并将它们包装在调用cat中,当执行该调用时,将连接第三维中的所有二维矩阵以重新创建您的输入矩阵。
M = reshape(1:8, [2 2 2]);
arrays = arrayfun(@(k)mat2str(M(:,:,k)), 1:size(M, 3), 'uni', 0);
result = ['cat(3', sprintf(', %s', arrays{:}), ')'];
result =
'cat(3, [1 3;2 4], [5 7;6 8])'
isequal(eval(result), M)
1
Run Code Online (Sandbox Code Playgroud)
更新
再考虑一下,一个更优雅的解决方案是展平输入矩阵,在其mat2str上运行,然后在用于重新创建数据的字符串中,我们reshape结合原始维度来提供将重新创建数据的命令。这适用于任何维度的数据。
result = sprintf('reshape(%s, %s);', mat2str(M(:)), mat2str(size(M)));
Run Code Online (Sandbox Code Playgroud)
所以对于下面的 4D 输入
M = randi([0 9], 1, 2, 3, 4);
result = sprintf('reshape(%s, %s);', mat2str(M(:)), mat2str(size(M)));
'reshape([6;9;4;6;5;2;6;1;7;2;1;7;2;1;6;2;2;8;3;1;1;3;8;5], [1 2 3 4]);'
Run Code Online (Sandbox Code Playgroud)
现在如果我们使用这个生成的字符串重建数据,我们可以确保我们得到正确的数据。
Mnew = eval(result);
size(Mnew)
1 2 3 4
isequal(Mnew, M)
1
Run Code Online (Sandbox Code Playgroud)
通过将类和精度输入指定为mat2str,我们甚至可以更好地近似输入数据,包括浮点数。
M = rand(1,2,3,4,5);
result = sprintf('reshape(%s, %s);', mat2str(M(:),64,'class'), mat2str(size(M)));
isequal(eval(result), M)
1
Run Code Online (Sandbox Code Playgroud)