使用Matlab将{3d矩阵转换为String并返回3d矩阵

时间:2018-03-20 13:43:30

标签: matlab

我目前正致力于如何使用Wang的算法将秘密图像嵌入到封面图像中的速记任务。基本上我只想改变例如: 3d矩阵

A(:,:,1) = [5 7 8; 0 1 9; 4 3 6];
A(:,:,2) = [1 0 4; 3 5 6; 9 8 7];
A(:,:,3) = [7 9 3; 4 5 9; 1 9 9];

To

Str = '578019436104356987793459199' 

反之亦然,如果有人可以提供帮助的话。

2 个答案:

答案 0 :(得分:4)

由于展开MATLAB矩阵的顺序,你的问题不像看起来那么简单。您需要使用reshapepermute才能使其正常运行。

str=arrayfun(@num2str,reshape(permute(A,[2 1 3]),[],1,1)).';
A2=permute(reshape(arrayfun(@str2double,str),[size(A)]),[2 1 3]);
isequal(A2,A)

这当然假设@Sardar在您的问题中评论:所有数字都有一位数(即整数范围为0-9)

答案 1 :(得分:4)

另一种方法是使用sprintf。您首先需要单独转置每个切片,因此根据Ander的答案调用permute将达到这一点。在您可以提供单个格式字符串%d(整数)和实际置换矩阵之后,它将逐列展开所有元素并将所有数字连接在一起。另外一个优点是您不再需要假设每个矩阵元素只占一个数字:

str = sprintf('%d', permute(A, [2 1 3]));

实施例

>> str = sprintf('%d', permute(A, [2 1 3]))

str =

578019436104356987793459199

>> class(str)

ans =

char

但是,要重建矩阵,您必须假设每个矩阵有一个元素。在这种情况下,您可以使用未记录的sprintfc函数,该函数可以为每个字符输出一个单元格,然后将字符转换为str2double的数字。最后,重塑你的矩阵并撤消转置:

A2 = permute(reshape(str2double(sprintfc('%c', str)), size(A)), [2 1 3]);

实施例

>> A2 = permute(reshape(str2double(sprintfc('%c', str)), size(A)), [2 1 3])

A2(:,:,1) =

     5     7     8
     0     1     9
     4     3     6


A2(:,:,2) =

     1     0     4
     3     5     6
     9     8     7


A2(:,:,3) =

     7     9     3
     4     5     9
     1     9     9