Vectorization: incompatible sizes of arrays
4 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Milan Lstiburek
am 18 Sep. 2022
Kommentiert: Torsten
am 19 Sep. 2022
O is a matrix with n_p x n_o rows; P is a matrix with n_p rows. Both matrices have three columns.The second column in O should be filled with the average of two values in the second column of P: the first value at the row ip and the second value at randomly selected row.
counter = 0;
for ip = 1:n_p
for io = 1:n_o
counter = counter + 1;
O(counter,2) = (P(ip,2) + P(randi(n_p),2))/2;
end
end
I attempted to vectorize the code as:
ip = 1:n_p;
io = 1:n_o;
O(ip(:)+io(:),2) = (P(ip(:),2)+P(randi(n_p),2))/2;
I am receiving the following message: „Arrays have incompatible sizes for this operation“. Thank you for any suggestions.
0 Kommentare
Akzeptierte Antwort
Torsten
am 18 Sep. 2022
Bearbeitet: Torsten
am 18 Sep. 2022
n_p = 3;
n_o = 3;
P = rand(n_p,2);
R = randi(n_p,n_p*n_o,1)
IP = (cell2mat(arrayfun(@(i)vertcat(repmat(i,1,n_o)),1:n_p,'UniformOutput',0))).'
O(:,2) = (P(IP,2)+P(R,2))/2
3 Kommentare
Bruno Luong
am 19 Sep. 2022
Bearbeitet: Bruno Luong
am 19 Sep. 2022
IP = (cell2mat(arrayfun(@(i)vertcat(repmat(i,1,n_o)),1:n_p,'UniformOutput',0))).'
can be simplified to
IP = replem((1:n_p)',n_o)
Weitere Antworten (2)
Bruno Luong
am 19 Sep. 2022
Bearbeitet: Bruno Luong
am 19 Sep. 2022
Simpler one liner
O(:,2) = P(randi(end,n_o,end),2) + repelem(P(:,2),n_o) / 2;
0 Kommentare
Bruno Luong
am 18 Sep. 2022
Bearbeitet: Bruno Luong
am 18 Sep. 2022
O(:,2) = reshape(reshape(P(randi(end,n_o,end),2),n_o,[]) + reshape(P(:,2),1,[]), [],1) / 2;
2 Kommentare
Siehe auch
Kategorien
Mehr zu Logical finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!