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

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 循环?

Sue*_*ver 5

这不是直接可能的,因为没有内置字符来表示第三维中的连接(类似于 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)

  • @AnderBiguri 让我们假设我有一个 16 x 16 x 3 的图标,我想通过函数 `getSueverIcon()` 返回它,我不想将二进制图像文件存储在版本控制中。您可能需要某种方式(给定一个图像文件)来创建一个字符串,您可以将其转储到一个 m 文件中以创建相同的图像。 (2认同)