【问题标题】:finding indices of min or max calculated in a range of an array or matrix in matlab查找在matlab中的数组或矩阵范围内计算的最小值或最大值的索引
【发布时间】:2018-09-26 10:29:22
【问题描述】:

如果我有一个矩阵

A=rand(50,4);

还有一个范围值矩阵,例如

range=[1 10 15 30 45 50];

我想计算范围矩阵上所有 A 列中的最小值及其索引。例如

for i=1 :numel(range)-1
[value index]= find(min(A(range(i):range(i+1),[],1)

if i>1
            index=index+ range(i)+1;       % indx# was calculated onlyin a 
                                              % range of array and not for 
                                             %whole array.Updated here
 end

B_ind(i,:)=index;
B_val(i,:)=value;
end

如何在不使用循环方法的情况下为range(i:i+1) 获取min(A) 的索引?

简单地说,矩阵'B'应该是这样的

B(1,column 1:4)=index of min(A (1:10))   in every column

B(2,column 1:4)=index of min(A (11:15))  in every column

B(3,column 1:4)=index of min(A (16:30))  in every column

等等……

我的问题是如何在没有“for 循环”的情况下做到这一点?

【问题讨论】:

  • 你需要index=index+range(i)-1;,而不是+1。
  • 为什么要避免循环?这是您代码中的瓶颈吗?我认为你的方法非常好!
  • 是的@CrisLuengo,你是对的。感谢您指出错误。我同意。我想遵循矢量化方法,因为循环需要更多时间。实际上我的数据非常大。
  • 循环在 MATLAB 中不再缓慢。一些矢量化代码仍然比相应的循环快,但它们不再像过去那样快 100 倍或 1000 倍,而是快了 2 倍。如果矢量化需要大的中间矩阵或复杂的索引,现在很多矢量化代码实际上速度较慢。

标签: matlab indexing


【解决方案1】:

一种可能性是:

% generate example data set
A=rand(50,4);
range=[1 10 15 30 45 50];

% generate indexes of interest
tmp_idx= arrayfun(@colon,range(1:end-1),range(2:end),'un',0);
% calculate the min function over the indexes
[min_value,min_idx]=cellfun(@(x) min(A(x,:)), tmp_idx, 'UniformOutput', false);
% get matrix B (with the offset of ranges)
B=cell2mat(min_idx')+(range(1:end-1)+1)';
B(1,:)=B(1,:)-2;

【讨论】:

  • 不错!但我不会更快,因为cellfunarrayfun 是作为简单循环实现的。
猜你喜欢
  • 2018-07-27
  • 2013-06-01
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 2014-06-17
  • 2015-10-25
相关资源
最近更新 更多