【发布时间】:2012-08-01 12:53:49
【问题描述】:
感谢您对我的帖子表现出兴趣:)
让我快速描述一下我正在使用的数据:
我将 excel 中的重要数据放入我的 matlab 脚本中,因此我最终得到了 3 个向量。它们是:
- “FIT_txt”(约 25 万行,每个单元格中包含混合的字母和数字。重复条目)
- “FIT_num”(与仅包含数字的“FIT_txt”的行数相同)
- “扇区”(约 5k 行,每个单元格中包含混合字母和数字。唯一条目)
现在,我想要实现的目标:
创建一个向量,计算“扇区”中每一行在“FIT_txt”中出现的次数。例如:假设“sector”中的第一个条目是“AB10”,那么我想创建一个向量来计算“AB10”在“FIT_txt”中出现的次数;这应该保存在新向量的第一行。新向量的第二行计算“FIT_txt”中“扇区”(比如“AB11”)中第2行的出现次数等。
创建一个向量,将“FIT_num”中出现在与“FIT_txt”中对应于“扇区”条目的条目在同一行中的所有数字相加,并相应地对其进行排序。例如:“扇区”的第 1 行中的“AB10”在“FIT_txt”中出现 3 次 - 它出现在第 2、500 和 2000 行。我想将“FIT_num”中的第 2、500 和 2000 行相加并将它们放入新向量的第一行。
现在,这是对我的问题的简化;本质上,我正在使用更多数据,并且我正在重复此过程以找到更多数量的新向量/矩阵。关于简化,我已经设法通过这样做来解决问题:
units = zeros(length(sector),1);
installed = zeros(length(sector),1);
for a = 1:length(sector)
for z = 1:length(FIT_txt(:,1))
if strcmp((FIT_txt(z,1)),(sector(a)))==1
units(a,1) = units(a,1) + 1;
installed(a,1) = installed(a,1) + FIT_num(z,1);
end
end
end
不幸的是,我担心这是非常低效的,而且计算时间太长。
我已经成功地在我的第一个问题(计算出现次数)上取得了不错的结果:
units = zeros(length(sector),1);
for a = 1:length(sector)
units(a,1) = sum(strcmp((FIT_txt(:,1)),(sector(a)))
end
效果很好(尽管仍然比我想要的要长一点),但是,我不知道如何解决我的第二个问题(计算“FIT_num”中对应的值)。
如果您能帮助我找到尽可能有效地解决我的问题的解决方案,我将不胜感激。
非常感谢您。
约翰
【问题讨论】:
-
sector中的一行可以在FIT_txt的每行中出现两次吗?总和应该怎么比去?按出现次数加权还是仅添加或不添加?另外,FIT_txt, 250x1 元胞数组是什么数据类型? -
感谢冈瑟的回复。 “扇区”中的大多数行在“FIT_txt”中出现多次。我想a)计算“扇区”中的每个条目出现在“FIT_txt”中的次数。 b) 对“FIT_num”中与“FIT_txt”在同一行中对应于“sector”中相同条目的所有值求和。那有意义吗?抱歉,我觉得有点难以表达。
-
但是一个扇区行可以在一个 FIT_txt 行中出现多次吗?例如,
sector(1) = 'AB10',它在FIT_txt的第一行出现了两次。FIT_num中的对应值现在应该计算两次吗? -
啊。每行只能出现一次。即,您不会得到类似 FIT_txt(1)='AB10AB10' 的内容,它只会包含“AB10”,因此与扇区 (1) 完全相同。
-
澄清一下:“FIT_txt”和“FIT_num”的格式为 (x,1),其中 x 大约为 250000。“sector”具有相同的格式,但行数要少得多 (~5k)。