Contiguous memory and relational operators

1 次查看(过去 30 天)
I have a 2D matrix of floats called data (approx size 1E5 x 2E2) and wish to test some conditions many times (>1e9 times) eg
data(i:j, h) <= k, where k is a float
This process is a real bottleneck in my code according to the profiler.
Here the author (Jan) seems to suggest running permute.m to make the memory contiguous before applying the inequality operator.
I am unclear how to order the permutation though. What have I missed? (or is the permute trick only valid in dimensions above 2?)
tmp = permute(data(i:j, h) , orderVec); %where does orderVec come from???
tmp <= k %this is now fast
  2 个评论
James Tursa
James Tursa 2013-2-22
The permute "trick" was mentioned because the other post had : for the trailing dimension. What is your exact situation for subscripting? Is it always of the form (i:j,h) with i, j, and h scalars but changing each iteration?
Matlab2010
Matlab2010 2013-3-5
编辑:Matlab2010 2013-3-5
yes thats correct, it is always of the form (i:j,h) with the scalars i, j, and h changing each iteration.
does this help at all?

请先登录,再进行评论。

采纳的回答

Jan
Jan 2013-2-22
The permute method is useful, when a large multi-dimensional array is indexed repeatedly. In the other thread it was P(M, 4, N) with large M and N. Then calling P(:,i,:) repeatedly consumes much more time than getting Q(:, :, i) after:
Q = permute(P, [1,3,2]);
In your case, the comparison could be performed once only:
comp = (data <= k);
And instead of comparing in a loop, the vector comp(i:j, h) can be used directly. But I assume this is not a dramatic improvement. More precise advices are possible if you post the relevant part of the code.

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Multidimensional Arrays 的更多信息

标签


Translated by