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