element by element subtraction using bsxfun

1 次查看(过去 30 天)
Hi everyone,
I have an array, for simplicity let it be:
a = [1 2 3; 4 5 6; 7 8 10];
I would like to perform an element by element subtraction, I have using:
Av = bsxfun(@minus, a(:)', a(:));
However this does not give me the desired result. For the resulting array I want:
Aresult = [0 -1 -2 1 0 -1 2 1 0; -3 -4 -5 -2 -3 -4 -1 -2 -3;-6 -7 -8 -5 -6 -7 -4 -5 -6 ....(continued)]
So to explain the desired result I would like to take an individual element and then subtract the surrounding elements to create a 3x3 sub array in the larger 9x9 array. So in the array above going from left to right
1-0 = 0;
1-2 = -1;
1-3 = -2; (going to the next row down)
1-4 = -3;
1-5 = -4;
1-6 = -5; (going down a row again)
1-7 = -6;
1-8 = -7;
1-9 = -8;
So these results would provide the first 3x3 sub array. This would then be repeated for all elements of the initial array a.
I would be very grateful for any help/ comments you can provide, I hope my explanation wasn't too confusing :).
Thanks, John.

采纳的回答

Stephen23
Stephen23 2016-6-25
编辑:Stephen23 2016-6-25
This works for an array whatever its size:
>> A = [1 2 3; 4 5 6; 7 8 9]
A =
1 2 3
4 5 6
7 8 9
>> cell2mat(arrayfun(@(a)a-A,A,'UniformOutput',false))
ans =
0 -1 -2 1 0 -1 2 1 0
-3 -4 -5 -2 -3 -4 -1 -2 -3
-6 -7 -8 -5 -6 -7 -4 -5 -6
3 2 1 4 3 2 5 4 3
0 -1 -2 1 0 -1 2 1 0
-3 -4 -5 -2 -3 -4 -1 -2 -3
6 5 4 7 6 5 8 7 6
3 2 1 4 3 2 5 4 3
0 -1 -2 1 0 -1 2 1 0

更多回答(2 个)

Andrei Bobrov
Andrei Bobrov 2016-6-25
编辑:Andrei Bobrov 2016-6-25
t = ones(size(a));
out = kron(a,t) - kron(t,a);
or
[m,n] = size(a);
out = repelem(a,m,n) - repmat(a,m,n);

John Draper
John Draper 2016-6-25
Hi everyone just an update. I have written some code that will return the required result:
if true
a = [1 2 3; 4 5 6; 7 8 9];
Av1 = a(1,1) - a(1:3,1:3);
Av2 = a(1,2) - a(1:3,1:3);
Av3 = a(1,3) - a(1:3,1:3);
Av4 = a(2,1) - a(1:3,1:3);
Av5 = a(2,2) - a(1:3,1:3);
Av6 = a(2,3) - a(1:3,1:3);
Av7 = a(3,1) - a(1:3,1:3);
Av8 = a(3,2) - a(1:3,1:3);
Av9 = a(3,3) - a(1:3,1:3);
Av = [Av1 Av2 Av3; Av4 Av5 Av6; Av7 Av8 Av9];
% code
end
However I feel there must be a more elegant want to write this, perhaps for an array that doesn't necessarily have a size of 3 x 3. Thanks again, John.

类别

Help CenterFile Exchange 中查找有关 Matrix Indexing 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by