对于尺寸等于或小于2的矩阵,命令为:
例如:
>> mat2str(ones(2,2))
ans =
[1 1;1 1]
但是,as the help states,这不适用于更高维度:
>> mat2str(rand(2,2,2))
Error using mat2str (line 49)
Input matrix must be 2-D.
如何使用代码兼容的方法输出尺寸大于2的矩阵,而无需使用定制的for循环?
答案 0 :(得分:4)
这不是直接可行的,因为没有内置字符来表示第三维中的连接(类似于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
<强>更新强>
在考虑了这个之后,更优雅的解决方案是展平输入矩阵,在其上运行mat2str
,然后在用于重新创建数据的字符串中,我们使用reshape
结合原始维度提供将重新创建数据的命令。这适用于任何数据维度。
result = sprintf('reshape(%s, %s);', mat2str(M(:)), mat2str(size(M)));
所以对于以下的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]);'
现在,如果我们使用这个生成的字符串重建数据,我们可以确保获得正确的数据。
Mnew = eval(result);
size(Mnew)
1 2 3 4
isequal(Mnew, M)
1
通过指定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