【问题标题】:Read with subsampling in MATLAB在 MATLAB 中使用二次采样读取
【发布时间】:2015-09-23 01:08:46
【问题描述】:

在 MATLAB 中是否有二次采样可供阅读?输入数据如下:

id=3,age=25, 0.5 0.5 0.2 0.6 0.6 0.5

id=1,age=15, 0.5 0.8 0.2 0.9 0.6 0.9

id=7,age=24, 0.5 0.2 0.9 0.6 0.1 0.5

(已编辑)对于 LAST SIX 列,我只想要三的倍数的列(即 LAST SIX COLUMNS 中的第 3 列和第 6 列,相当于整个第 5 列和第 8 列数据文件)被读取。也就是像这样的矩阵:

0.2 0.5

0.2 0.9

0.9 0.5

理想情况下,代码如下所示:

for line=1:maxLine
  header(line,:) = fscanf(fid,'id=%d,age=%d,',[1,2]);
  content(line,:) = fscanf(fid,'only read columns multiple of three');
end;

我知道我可以读取整行和子样本,问题是,我正在处理的数组规模很大,10k+ 列,我不想消耗太多内存。

【问题讨论】:

  • “三的倍数”是什么意思? 0.20.5 不能被 3 整除,并且在任何行或列中出现 3 次的唯一数字是 0.5

标签: matlab memory scanf formatted-input


【解决方案1】:

有办法: 如果您使用fopen,您只能访问一次文件,因此您不能循环访问。因此,您需要将所有必要的数据加载到一个数组中,然后对其进行转置。 忽略一些元素可以实现您节省空闲内存的愿望:

 fid = fopen('new.txt','r');
 A = fscanf(fid, 'id=%d,age=%d, %*f %*f %f %*f %*f %f\n', [4 inf]) 

我使用了你的数据并得到了这个结果:

A =

    3.0000    1.0000    7.0000
   25.0000   15.0000   24.0000
    0.2000    0.2000    0.9000
    0.5000    0.9000    0.5000

你可以在这里读到http://www.mathworks.com/help/matlab/ref/fscanf.html?searchHighlight=fscanffscanf 将数据读入列,这就是我们需要转置它的原因。 所以使用A=A' 可以得到你想要的结果:

A =

    3.0000   25.0000    0.2000    0.5000
    1.0000   15.0000    0.2000    0.9000
    7.0000   24.0000    0.9000    0.5000

现在您可以根据需要制作两个不同的矩阵。

【讨论】:

  • 我相信我可以用时尚的方式使用 for-loop for i=1:DataLine \n A(i,:) = fopen(fid,'format',[1 6]); \n end;
  • 我没试过这个版本。但是你不能使用fopen 来读取数据。看起来你犯了错误,意思是fscanf。是吗?如果是这样,我尝试了一些循环版本并且已经写信给你 - 我遇到了这个问题 - fopen 只正确工作一次。如果我在循环中使用它,我必须在每次迭代时使用fopen,但它会从文件的开头读取。如果你能解决这个问题,请告诉我!
  • 这是一个错字。我的意思是fopen 在循环外,fscanf 在循环内。感谢您展示%*f 的用法。我从来不知道。问题是,我们有 10k+ 列,我们不能写%*f 数千次。我们需要使用迭代来处理元素的读取。
  • 看,在我的示例中,我使用了一次fscanf,但它读取了所有 txt 文件。所以,如果你有 10k+ 个相同结构的字符串(每个字符串都有这个 'id ... ages' 和相同的位数)它会起作用。 fscanf 读取文件,而它的数据看起来像 fscanf 的第二个参数。
猜你喜欢
  • 2018-03-17
  • 2020-03-05
  • 2020-03-20
  • 1970-01-01
  • 2016-05-08
  • 2016-05-31
  • 2013-01-26
  • 2012-12-18
  • 2023-03-18
相关资源
最近更新 更多