将3D Matlab矩阵作为1D写入文件并在C中读回

时间:2017-08-15 13:42:12

标签: c arrays matlab matrix

我有一个三维Matlab矩阵,形状为3x4x5。现在我想将此Matrix写入1维的.txt文件,并在C中读回。

但是,编写的数字应首先是x和y维度(所以4x5)后跟z维度(3)。

填写矩阵的示例代码:

duneven = 1:3*4*5
duneven = reshape(duneven,[3 4 5]);

我希望通过像这样置换矩阵来获得这种效果:

duneven = permute(duneven,[3 1 2]);

并写出来:

fp = fopen('testuneven.txt','w');
fprintf(fp,'%f ',duneven);
fclose(fp);

然而,用C语言阅读 - 就像这样:

FILE* fp;
fp = fopen("testuneven.txt","r");

for(int i = 0; i < 3*4*5;i++){
   float var;
   fscanf(fp,"%f ",&var);
   printf("%f ",var);
}
fclose(fp);

在Matlab中读出它会产生相同的输出。此外,在shell中输出文件会返回相同的结果。所以这个问题位于Matlab代码

不回馈所需的输出。相反,它打印出第一个cols。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

我猜你在permute()调用中混淆了订单。您对所需维度顺序统计数据4x5然后3

的初步描述

你的代码

duneven = 1:3*4*5
duneven = reshape(duneven,[3 4 5]);
duneven = permute(duneven,[3 1 2])

产生5x3x4。

考虑使用duneven = permute(duneven,[2 3 1])

答案 1 :(得分:0)

问题是,matlab按列方式写出矩阵,而C则以行方式读取矩阵。可以肯定的是,它写得正确,我做了以下几点:

duneven = 1:3*4*5
duneven = reshape(duneven,[3 4 5]);

%in case that the shape is not known
duneven_shape = size(duneven);


fileID = fopen('testunven.txt','w')

for i=1:duneven_shape(1)
    v = reshape(squeeze(duneven (i,:,:))',[1 duneven_shape(2)*duneven_shape(3)]);
    fprintf(fileID,"%f ",v);
end
fclose(fileID);