如何在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)=3
与 A(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
你的其余代码没问题。
我有一个文件和给定大小为 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)=3
与 A(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
你的其余代码没问题。