使用输出作为兼容的matlab代码打印多维数组的值

时间:2016-03-23 18:48:29

标签: matlab multidimensional-array

对于尺寸等于或小于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循环?

1 个答案:

答案 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