Hi everyone
Can you help me for my code?.
I want to assign matrix b to struct g.a at position c.
g(1).a=[1 2 3 4]'
g(2).a=[1 1 3 4]'
g(3).a=[4 3 1 2]'
c=[1 2]
b=[ 3 3 3 3;4 5 4 4]'
My hope output is g.a =
3 4 4
3 5 3
3 4 1
3 4 2
Thank you so much.

3 Kommentare

Jan
Jan am 23 Jul. 2018
g.a cannot be a matrix, because g is a struct array already. Then g.a means g(:).a and it is not clear, what you want to acieve.
Rik
Rik am 23 Jul. 2018
I agree with Jan. If you want to assign vectors to specific fields, you can always use a for-loop, but how you would get your matrix out is unclear to me.
g(1).a=[1 2 3 4]';
g(2).a=[1 1 3 4]';
g(3).a=[4 3 1 2]';
c=[1 2];
b=[ 3 3 3 3;4 5 4 4]';
for n=1:numel(c)
g(c(n)).a=b(:,n);
end
Tiki Tiki
Tiki Tiki am 24 Jul. 2018
Thank. but actualy my problem is speed up. so i dont use For here. Can you help me more?

Melden Sie sich an, um zu kommentieren.

 Akzeptierte Antwort

Guillaume
Guillaume am 23 Jul. 2018
Bearbeitet: Guillaume am 23 Jul. 2018

1 Stimme

As per jan's comment, g.a means nothing. If you type g.a in the command window, you will get 3 outputs (3 times: ans = ...).
[g.a] will indeed return a matrix, which is the horizontal concatenation of all the outputs of g.a. However, [g.a] does not exist in the structure. I believe that you've misunderstood how structures work if that's what you want.
If you want to replace g(c(i)).a by b(:, i), then the easiest is a loop:
for col = 1:numel(c)
g(c(col)).a = b(:, col);
end
While it can be done without a loop, it's awkward and probably slower:
a = {g.a}; %concatenate all in a cell array
a(c) = num2cell(b, 1); %replace columns determined by c by columns in b
[g.a] = a{:}; %put back into structure

4 Kommentare

Tiki Tiki
Tiki Tiki am 24 Jul. 2018
Thank. but my problem is speed up. so when i use num2cell function. it takes much time in my code. so i just want to use vectorztion in this case to speed up.
do you have any solution for this? Thank you.
Guillaume
Guillaume am 24 Jul. 2018
The loop should be the fastest option. You cannot vectorise the loop due to your usage of a structure array.
If you want more speed, then you need to change the way you store your data. It doesn't sound like a structure array is what you need in this case. What KL suggested, a scalar array with matrices in the field would probably work better for you, but since you haven't described your use case, it's hard to tell.
Jan
Jan am 24 Jul. 2018
Bearbeitet: Jan am 24 Jul. 2018
+1. "If you want more speed, then you need to change the way you store your data" - exactly. Speed is not only concerned by the code, but the underlying representation of the data plays an important role.
If g is large, care for a proper pre-allocation. Create e.g. the last field g(max(c)).a at first. If c is sorted, you can run the loop in backward direction:
for col = numel(c):-1:1
But the fastest way would be to keep the matrix b and store only the column indices in the struct array.
Tiki Tiki
Tiki Tiki am 25 Jul. 2018
Thank. Can I ask more about GPU?
How can I work this code on GPU? in my case, g.a is big size. and
because I work on each position of g.a, like get g(1).a or g(2).a,
so How do i change data?

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

KL
KL am 23 Jul. 2018

0 Stimmen

probably you mean something like this
g.a(:,1)=[1 2 3 4]';
g.a(:,2)=[1 1 3 4]';
g.a(:,3)=[4 3 1 2]'
c=[1 2]
b=[3 3 3 3;4 5 4 4]'
and then simply use c as indices in a
g.a(:,c) = b

1 Kommentar

Tiki Tiki
Tiki Tiki am 24 Jul. 2018
Sorry. I dont mean that. because this is a samples in my work. I defined code like that. so i cannot change. Can you help me?

Melden Sie sich an, um zu kommentieren.

Kategorien

Gefragt:

am 23 Jul. 2018

Kommentiert:

am 25 Jul. 2018

Community Treasure Hunt

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

Start Hunting!

Translated by