Matlab 基于另一个矩阵的值提取一个矩阵中的值,该矩阵在倍频程中没有for循环
我想知道是否有一种方法可以对一个矩阵的值进行操作,分别基于另一个矩阵中每一行的值,而不使用Matlab 基于另一个矩阵的值提取一个矩阵中的值,该矩阵在倍频程中没有for循环,matlab,for-loop,matrix,octave,vectorization,Matlab,For Loop,Matrix,Octave,Vectorization,我想知道是否有一种方法可以对一个矩阵的值进行操作,分别基于另一个矩阵中每一行的值,而不使用for循环 下面是一个具体的例子 数据是一个约500k行的矩阵,有三列:第一列是小时/日期列表(我把它们作为序列号),几年来每天24小时,第二列是位置ID,第三列是该位置的电费 hours有两列:第一列是作为序列号的日期/小时列表,第二列是特定于该小时的某个上限 我需要做的是,对于小时中的每个日期和小时,查找低于小时中设置的上限的电气成本的最大值,如果ID是唯一的,则将相应位置的ID保存在小时的第三列中,或
for
循环
下面是一个具体的例子
数据
是一个约500k行的矩阵,有三列:第一列是小时/日期列表(我把它们作为序列号),几年来每天24小时,第二列是位置ID,第三列是该位置的电费
hours
有两列:第一列是作为序列号的日期/小时列表,第二列是特定于该小时的某个上限
我需要做的是,对于小时
中的每个日期和小时,查找低于小时
中设置的上限的电气成本的最大值,如果ID
是唯一的,则将相应位置的ID保存在小时
的第三列中,或者,如果没有满足条件的位置,或者如果有多个位置,则为零
我正在使用的代码的简化版本:
#Add a third column for the hours matrix
ids=zeros(rows(hours),1)
hours=horzcat(hours,ids)
for i=1:rows(hour)
#Get the data for all locations in that hour
idx=(data(:,1)==hour(i,1) )
hourlydata=(data(idx,:))
#Get the ID for the maximum below the limit in that hour
idx=(hourlydata(:,3)<hour(i,2))
idlimit=(hourlydata(idx,3)==max(hourlydata(idx,3))
dataid=hourlydata(idlimit,2)
#Check if the data exists and is unique
if(rows(dataid)==1)
id=dataid(1,1)
else
id=0
endif
#Save the ID
hour(i,3)=id
endfor
#为工时矩阵添加第三列
ids=零(行(小时),1)
小时=horzcat(小时,ID)
对于i=1:行(小时)
#获取该小时内所有位置的数据
idx=(数据(:,1)=小时(i,1))
hourlydata=(数据(idx,:)
#获取该小时内低于限制的最大值的ID
idx=(hourlydata(:,3)您可以使用arrayfun
data = [datenum('2014-01-17'), 1, 13;datenum('2014-01-18'), 2, 7]
hours = [datenum('2014-01-17'), 17; datenum('2014-01-18'), 3]
然后定义一个选择器函数
function id = select( d, limit, data )
idx = (data(:,1)==d );
hourlydata = (data(idx,:));
idx = (hourlydata(:,3)<limit);
idlimit = (hourlydata(idx,3)==max(hourlydata(idx,3)));
dataid=hourlydata(idlimit,2);
if length(dataid)==1
id=dataid(1,1)
else
id=0
end
end
您可以轻松地将此向量与小时合并
现在我怀疑这是快得多,但没有循环。与MATLAB一起工作,没有检查与倍频程
arrayfun(@(d, limit) select(d, limit, data), hours(:,1), hours(:,2))
ans =
1
0