Can you return a matrix for all elements of vector A through vector B without a loop?
1 Ansicht (letzte 30 Tage)
Ältere Kommentare anzeigen
Christopher Desmond
am 23 Jun. 2016
Kommentiert: Christopher Desmond
am 1 Jul. 2016
I was trying to vectorize my code as much as possible today and when vectorizing a for-loop I encountered this issue. It just doesn't seem to make sense to me.
If I have some vector A = [10;20;30] and some vector B = [20;30;40] is there anyway call C = A:B such that C is equal to every element of A through each element of B?
For example this output is what I expected:
[10] [15]
A = [20] B = [25]
[30] [35]
C = A:B
[10, 11, 12, 13, 14, 15]
C = [20, 21, 22, 23, 24, 25]
[30, 31, 32, 33, 34, 35]
I would like to do this without a for-loop though this is easily accomplished with a one:
for n=1:3
C(n) = A(n):B(n)
end
My confusion arises because even though a for-loop does work, C=A:B is a call on two multi-element vectors yet C=A:B actually executes as C=A(1):B(1) and returns:
C = [10,11,12,13,14,15]
And without a loop the new vector n changes nothing:
n = 1:3
[10] [15]
A(n) = [20] B(n) = [25] A(n):B(n) = [10,11,12,13,14,15]
[30] [35]
If there isn't a way around looping or simply writing it out n times, could someone at least explain what I am missing and why this doesn't work the way I expect it to?
Thanks!
0 Kommentare
Akzeptierte Antwort
James Tursa
am 23 Jun. 2016
Assuming the values in A and B are consistent:
n = B(1) - A(1);
C = bsxfun(@plus,A,0:n);
3 Kommentare
James Tursa
am 23 Jun. 2016
A is a column vector:
10
20
30
0:n is a row vector:
0 , 1 , 2 , ... , n
The bsxfun function is simply applying the plus operation to the two inputs, A and 0:n. Since the two operands are different dimensions, bsxfun will do what is known as a "scalar expansion" in order to accomplish the operation. That is, wherever the dimensions of the operands don't match, and one of them is a 1 then it will virtually expand that dimension to match the other operand (like doing a repmat operation without actually physically performing the repmat). So for this specific example it gets the same result as the following without actually forming these two operands physically in memory:
[10 10 10 10 10 10] [0 1 2 3 4 5]
[20 20 20 20 20 20] + [0 1 2 3 4 5]
[30 30 30 30 30 30] [0 1 2 3 4 5]
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu Matrix Indexing finden Sie in Help Center und File Exchange
Produkte
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!