Read cell via indexing multiple times, without using for-loop
15 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Hello everyone!
I have a rather simple problem, but can't figure out a 'nice' solution for it, without using a for loop.
I have a cell array, which contains different options. And I have a Matrix, which tells me which of these options to use in different cases.
So I start with something like this:
Options = {'A' 'B' 'C'};
IndexMatrix = logical([
1 0 0
1 0 0
0 0 1
0 1 0]);
What I want to get is this outcome:
Choice =
'A'
'A'
'C'
'B'
This is my (simple) solution for this problem:
Data = cell(size(IndexMatrix,1),1);
for idx = 1:size(IndexMatrix,1)
Choice(idx) = Options(IndexMatrix(idx,:));
end
It works, but I'm curious if there might be a better solution, especially one without a for loop.
One idea was to use 'arrayfun', but I need to use every row of IndexMatrix on my cell, not every element.
Another idea would be to extend the cell to a second dimension, with the different options 'A' 'B' 'C' in every row, so you could do all the indexing at once. Somehow like this:
Choice = Options_extended(IndexMatrix)
But then again, I did not know how to extend the cell without using a for loop again. I was looking for something similar to what you would do with a vector. E.g.:
ones(4,1) * [1 2 3]
Anyway, I'm very interested, if anyone knows a 'clever' way to do this. Thanks!
0 comentarios
Respuesta aceptada
Andrei Bobrov
el 31 de Mayo de 2013
Editada: Andrei Bobrov
el 31 de Mayo de 2013
C = {'A' 'B' 'C'};
Ind = logical([
1 0 0
1 0 0
0 0 1
0 1 0]);
ii = bsxfun(@times,Ind,1:numel(C));
out = C(ii(ii~=0))';
or
x = repmat(C,size(Ind,1),1);
out = x(Ind);
1 comentario
Más respuestas (2)
Azzi Abdelmalek
el 31 de Mayo de 2013
idx=Options(sum(bsxfun(@times,IndexMatrix,1:3),2))
0 comentarios
Ver también
Categorías
Más información sobre Loops and Conditional Statements en Help Center y File Exchange.
Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!