how to avoid using num2cell when dealing to structure arrays?

4 visualizzazioni (ultimi 30 giorni)
I use a structure array, which contains a field i wish to manipulate for a subset of the structure array:
snr=[node.receivedSignal]./[node.receivedNoise]
temp=[node.power]
nodes_to_update=snr<threshold
newPower=temp(nodes_to_update)*2
at this point i have in my newPower array, (the power levels of the subset of nodes that i need to update). so far what i have been doing is the following:
X=num2cell(newPower)
[node(nodes_to_update).power]=deal(newPower)
Since this is in a loop that repeats too many times (simulation over time), i would like to avoid using num2cell and deal. i run the profiler, and these two functions are the major slowdown on my simulation.
is there a way of assigning values into a structure array's fields from a double array, without converting into a cell and then dealing it into the structure?
Working example:
a(1).a=3
a(2).a=3
a(3).a=5
b=[1 2]
the num2cell and deal solution:
x=num2cell(b)
[a([1 3]).a]=deal(x{:})
i am looking something in the spirit of:
[a([1 3].a]=deal(b(:))

Risposta accettata

Matt Fig
Matt Fig il 27 Ago 2012
There is a way to do it, and it will be faster (at least it is here):
for ii = 1:length(b)
a(idx(ii)).a = b(ii);
end
idx is the [1 3] in your example. For large structures and large index vectors, this will be more than twice as fast.
  2 Commenti
Jan
Jan il 28 Ago 2012
And pre-allocate "a" e.g. by running the loop over length(b):-1:1.
Angelos Vassiliou
Angelos Vassiliou il 28 Ago 2012
Thank you Matt, i fixed the question, and i will implement your suggestion. Preliminary results show an 87% reduction in time (on the time spent by num2cell and deal). I would just think that using the official MATLAB vectorized function would yield better result than a loop around the structure.

Accedi per commentare.

Più risposte (1)

Walter Roberson
Walter Roberson il 27 Ago 2012
No, there is not.
Note: your deal solution is not correct. You need to adjust to
[a([1 3]).a] = deal(x{:})
which can be abbreviated to
[a([1 3]).a] = x{:};
However, the num2cell() step is required, as is assigning the result to a variable.
  1 Commento
Angelos Vassiliou
Angelos Vassiliou il 28 Ago 2012
Thank you for you comment, i fixed the original post. By the way, just by removing the deal from the expression actually halved the time that the command took to execute. Now if only num2cell could also have been sidestepped...

Accedi per commentare.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by