How can I get the indices of values meeting a condition in a tall array?
4 次查看(过去 30 天)
显示 更早的评论
Hi everybody,
I have a tall array containing voltage data. I want to thresholding the trace to receive the signals. So with thresh is the threshold, data is the tall double array (Mx1), I perform
data = abs(data);
loc = tall(data > thresh);
to get loc, a tall logical, containing ones for samples above threshold and zeros for samples below, after evaluating.
I just want to have the crossings, so I apply
location = diff(loc,1,1);
So locations where the signal crosses the threshold are 1, all others are 0 or -1;
But now I need a vector listing the position values (indices), and i use
starts = find(gather(location == 1));
Is there any possibility to realize that without gather to leave the array unevaluated?
Many thanks in advance!!!!
Eva
1 个评论
madhan ravi
2019-8-2
编辑:madhan ravi
2019-8-2
Eva-Maria Weiss's answer moved here:
I found that in the MATLAB documentation:
"The find function locates nonzero elements in tall column vectors, and can be useful to generate a vector of indices for elements that meet particular conditions. For example, k = find(X<0) returns the linear indices for all negative elements in X."
So I tried to convert a tall variable (location) of type tall double (unevaluated) to a Mx1 tall double (unevaluated) - to get a column vector,
location = location(:,1);
but still I got the error message
"undefined function 'find' for input arguments of type'tall' "
Isn't oit a column vector? How can I convert my variable to a column vector thats's a real one?
I really appreciate any help or hint!
Thank you very much in advance!
Eva
-----
Maybe find is not working on tall since I use 2017b?
So far I come up with some proceedings:
I aim to solve the issue by logical indexing;
so first I create this tall lgocal vector containing the crossings
loc = data(data > thresh);
location = diff(loc,1,1);
location = location == 1;
Then I creat a tall column vector containing indices:
index = location;
index(:,1) = tall([1:1:numbSamples -1]');
Then I select indices meeting the condition
starts = index(location,1);
starts(starts == 0) = [];
To see if that approach is working, I want evaluate the result by using
starts(starts == 0) = [];
Evaluating starts properly, but after finishing pass 1 of 2, I was again left with an error message saying:
Incompatible tall array arguments. The tall arrays must be based on the same datastore and
be indexed in the first dimension using the same logical index vector.
Learn more about errors encountered during GATHER.
How can I overcome that? Could anyone please help, meanwhile I really feel like circling around!
回答(1 个)
Guillaume
2019-8-2
编辑:Guillaume
2019-8-2
Maybe find is not working on tall since I use 2017b
Indeed, support for using find on tall arrays was added in R2018a.
As for your error with your workaround, there's a big difference between
[1:1:numbSamples -1]
and
[1:1:numbSamples-1]
%or
[1:1:numbSamples - 1]
The former is equivalent to
[1:1:numbSamples, -1] %concatenation! not subtraction
and will therefore have numbSamples + 1 elements when you meant to have numbSamples - 1 elements. So, of course, the length doesn't match that of your logical array and you get an error.
To avoid this sort of issue:
- be consistent with your spacing. Either no space at all on both sides of the operator, or spaces on both sides.
- Don't use [] when you don't mean concatenation. If you want to transpose a vector surround it with (). This is (negligibly) faster to process as well.
So:
index(:,1) = tall((1:numbSamples-1)');
One potential problem with your workaround is that if numbSamples is sufficiently large, the temporary non-tall array 1:numbSamples-1 may not fit in memory.
5 个评论
Guillaume
2019-8-4
Indeed, I initially tried with in-memory tall arrays and my workaround worked fine for that. Having no tried with a datastore backed tall array, the workaround doesn't work.
There appears to be some restrictions on logical indexing that are not documented. Unfortunately, this is beyond my knowledge of tall arrays, so I don't think I can help further. If you can, I suggest you raise a support request with mathworks (or upgrade to 2018a so you can use find).
Note that I've raised my own bug report to at least get the documentation explaining why this does not work.
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Tall Arrays 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!