MATLAB单元阵列索引和循环

时间:2014-09-23 11:40:42

标签: arrays matlab loops while-loop cell

我正在尝试创建一个从文本文件中读取数据的脚本,并将数据绘制到散点图上。

例如,假设文件名是prices.txt并包含:

Pens 2 4
Pencils 1.5 3
Rulers 3 3.5 
Sharpeners 1 3
Highlighters 3 4

第2列和第3列是两个不同商店的商品价格。

我的脚本应该做的是读取价格,计算(使用其他功能)商店的未来价格,并将这些价格绘制到散点图上,其中x是一个商店,y是另一个商店。这是一个我知道的愚蠢的例子,但它符合描述。

不要太担心进行计算的其他函数,只是假设它做了它应该做的事情。

基本上,我想出了以下内容:

pricesfile = fopen('Prices.txt');
prices = textscan(pricesfile, '%s %d d');
fclose(pricesfile);

count = 1;
while count <= length(prices{1})
    for item = constants{1}
        name = constants{1}{count};
        store_A = prices{2}{count};
        store_B = prices{3}{count};
        (...other function goes here...)
    end
end

这样做之后,我完全卡住了。我在这背后的思考过程是遍历每个项目名称,并创建一个分配给该名称的向量,其中两个对应的价格作为向量中的项目,例如:

pens = [2 4]
pencils = [1.5 3]

等。然后,我会以某种方式在散点图上绘制矢量中的那些项目,并使用矢量名称作为标签。

我不太确定如何执行我的其余代码,或者即使我写的内容也会让我找到解决方案。

请提前帮助和谢谢。

1 个答案:

答案 0 :(得分:2)

pricesfile = fopen('Prices.txt');
data = textscan(pricesfile, '%s %d d');
fclose(pricesfile);

你是在正确的轨道上,但在此之后(通过一些hackery)你实际上并不需要循环:

plot(repmat(data{2},1,2)', repmat(data{3},1,2)', '.')
legend(data{1})

您不想做的是创建以字符串命名的变量。而是将它们存储在具有名称数组的数组中(这基本上就是您的textscan代码为您提供的)。 Matlab非常擅长处理矩阵/数组。

您还可以将price数组拆分为例如:

names = prices{1};
prices = [data{2:3}];

现在你可以很容易地对价格进行计算 prices_cents =价格* 100;

plot(prices_cents(:,[1,1]), prices_cents(:,[2,2]))
legend(names)

请注意,上面的[1,1]等只是使用索引作为实现repmat所做的简写...