Assigning a vector to multiple rows of a matrix

100 vues (au cours des 30 derniers jours)
Niko
Niko le 15 Mai 2014
Commenté : Chenglei QIAO le 28 Mai 2020
Hi all,
This is actually something I've been wondering for a while... Say I have a 1-by-4 vector A and a 5-by-4 matrix B. Now I want to assign the vector A to certain rows of B, but unfortunately you can't do something like
B([1,3,5],:)=A
since the dimensions will mismatch. What I ended up doing is
B([1,3,5],:)=repmat(A,3,1)
which works but seems really ugly (and probably slow as well since I used repmat). Is there a better way to do this?
Thanks!
Niko

Réponse acceptée

W. Owen Brimijoin
W. Owen Brimijoin le 16 Mai 2014
You could try using indices instead of subscripts:
%pick the rows in B you want to your A values to go into:
r = [1 3 5];
%and the corresponding columns:
c = [1 2 3];
%now get your indices:
idx = sub2ind(size(B),r,c);
%and use these indices as follows:
B(idx) = A(c);
This assumes that you want your columns filled in the order that they are found in A, but you could just as easily make a different index into A to pick particular values from that vector. This works as long as you ask for the same number of values from A as you have slots in B, if you follow me.
B(idx) = A([2 3 4]);
  1 commentaire
Dang Manh Truong
Dang Manh Truong le 11 Déc 2016
Modifié(e) : Dang Manh Truong le 11 Déc 2016
I'm sorry but it did not work :(

Connectez-vous pour commenter.

Plus de réponses (2)

Jos (10584)
Jos (10584) le 16 Mai 2014
Indeed, it looks a little ugly. However, using repmat is not that slow. Another, little uglier, but slightly faster and more straightforward solution is using a for-loop
A = 1:5
B = zeros(5,5) ;
for k = [1 3 5], B(k,:) = A ; end
  2 commentaires
Omar Peza
Omar Peza le 22 Nov 2019
Thanks!
Chenglei QIAO
Chenglei QIAO le 28 Mai 2020
Thanks! but I'm wondering why in this case, the for loop is even faster than the built-in repmat function?

Connectez-vous pour commenter.


Yao Li
Yao Li le 16 Mai 2014
b=ones(5,4);
a=[1;2;3;4];
If you wanna assign a to the 3rd row of b,
b=[b(1:2,:);a';b(4:5,:)]

Catégories

En savoir plus sur Programming dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by