如何在matlab中读取文件到数组

How to read a file to a array in matlab

我有一个文件和给定大小为 K 乘以 N 的矩阵。我想读取该文件并保存到该数组中。其中 K 由 N 的文件除法大小确定。如果该除法不是整数,我将在最后一个数据包的末尾添加零填充。如图,零填充用黄色表示。最后,我可以将文件的信息存储到一个K×N的数组中。你能帮我用matlab代码实现这个问题吗?先感谢您 更新:我想分享我的代码。请查看我的代码,如果有任何问题请告诉我

file='Lenna.bmp';
N=3;
fid=fopen(file,'r');
inter_list=fread(fid,'*uint8'); % 
fclose(fid);

%% Add padding
[m n]=size(inter_list);
numpadding=N-rem(m*n,N);
inter_list(end+numpadding,:)=0;
packet = reshape( inter_list.', [],N); 
[K N]=size(packet);

我发现一个问题是我的inter_list构造如下

66
77
54
0
12
0
0
0
0
0
54
0
0
0
40

如果我设置N=3表示第一个数据包是[66 77 54],第二个数据包是[0 12 0]等等。但是,当我使用该代码时

packet = reshape( inter_list.', [],N);  % N=3

那么输出是,

66  -58 109
77  102 -60
54  82  99

如何实现我的预期结果

 66    77   54
 0     12   0

您可以在 here

下载文件

Matlab 是一种“column major”语言(与许多其他语言不同)。这意味着数组的元素将在内存中 read/accessed/stored 列。

快速示例:数组:

A = [ 1 2 3
      4 5 6 ] ;

将通过从上到下,然后从左到右读取(与"from left to right, then top to bottom"相反)顺序写入内存(没有其他方法)。所以在记忆中,它看起来像:

A = [ 1 4 2 5 3 6 ] ;

如果您选择顺序索引而不是二维矩阵索引,这也是这些值的索引方式。 例如:A(1,3)=3A(5)=3 相同。


与大多数 Matlab 函数一样,reshape 函数将使用此顺序作为默认值。

(Matlab 文档过去对此更为明确,但在最近的文档中,我只能在其中一个示例的底部找到对此的一个小参考:"The elements in B also maintain their columnwise order from A.")


所以在你的情况下,你希望你的数据包包含 N sequential 值,你必须将其指定为reshape 函数作为 第一个 参数:

packet = reshape( inter_list , N , [] ) ;

现在将为您提供一个 [N K] 矩阵而不是 [K N],这是转置操作将实现您想要的结果的地方。它必须应用于重塑的结果,而不是输入。所以你的完整说明应该是:

packet = reshape( inter_list , N , [] ).' ; %'// the transpose ".'" operation is applied on the result of the reshape operation

你的其余代码没问题。