# Assign matrix to struct

42 ビュー (過去 30 日間)
Tiki Tiki 2018 年 7 月 23 日
コメント済み: Tiki Tiki 2018 年 7 月 25 日
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 件のコメント1 件の古いコメントを表示1 件の古いコメントを非表示
Rik 2018 年 7 月 23 日
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 2018 年 7 月 24 日
Thank. but actualy my problem is speed up. so i dont use For here. Can you help me more?

サインインしてコメントする。

### 採用された回答

Guillaume 2018 年 7 月 23 日

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 件のコメント2 件の古いコメントを表示2 件の古いコメントを非表示
Jan 2018 年 7 月 24 日

+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 2018 年 7 月 25 日
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?

サインインしてコメントする。

### その他の回答 (1 件)

KL 2018 年 7 月 23 日
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 件のコメント-1 件の古いコメントを表示-1 件の古いコメントを非表示
Tiki Tiki 2018 年 7 月 24 日
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?

サインインしてコメントする。

### カテゴリ

Help Center および File ExchangeMatrix Indexing についてさらに検索

### Community Treasure Hunt

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

Start Hunting!

Translated by