Singleton dimention as last dimension in matrix

44 Ansichten (letzte 30 Tage)
Bernard
Bernard am 22 Nov. 2011
Bearbeitet: Stephen23 am 28 Mär. 2024
Hello,
How do I create a singleton dimension as a last dimension in matlab, for example, so that size = 64 64 1.
I've tried reshape(x,[64 64 1]), but the resultant matrix is 64x64, not 64x64x1. Similarly with permute.
Thanks for any help!
  11 Kommentare
Erik Newton
Erik Newton am 28 Mär. 2024
In my use case, I'm encoding to Json and sending to a remote (3rd-party non-matlab) system which has to parse it. It is expecting 3 dimensions. and so as an example of my problem:
>> jsonencode(zeros(3,2,2))
ans =
'[[[0,0],[0,0]],[[0,0],[0,0]],[[0,0],[0,0]]]'
>> jsonencode(zeros(3,2,1))
ans =
'[[0,0],[0,0],[0,0]]'
I wish/need to keep a consistent level of square brackets, independent of whether I just happen to only have a single case in the 3rd dimension.
Stephen23
Stephen23 am 28 Mär. 2024
Bearbeitet: Stephen23 am 28 Mär. 2024
@Erik Newton: here is a workaround (does not work for scalar nor empty inputs). Assumes you want a 3D array.
A = randi(9,3,2,1);
[R,C,~] = size(A);
T = jsonencode(cat(3,A,nan(R,C,1)));
T = strrep(T,',null]',']')
T = '[[[8],[5]],[[3],[4]],[[1],[1]]]'

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

the cyclist
the cyclist am 22 Nov. 2011
Arrays in MATLAB have an implied infinitely long series of trailing singleton dimensions. You can index into them with no problem. For example
>> x = rand(3,3);
>> x(2,3,1,1,1,1,1,1,1,1,1,1,1)
is a valid indexing into x.
What is it that you are trying to do, that you need to emphasize that the array is 64x64x1?

Weitere Antworten (3)

Fangjun Jiang
Fangjun Jiang am 22 Nov. 2011
Unless you have further process need, there is really no need to do that.
>> size(rand(10))
ans =
10 10
>> size(rand(10),3)
ans =
1
>> size(rand(10),5)
ans =
1

David
David am 25 Okt. 2013
Trailing singleton dimensions ARE useful, and I want them too. This is useful for passing arguments to functions like convn. I would like to calculate discrete derivatives of a 3D data set as shown here. The calculation fails because reshape passes the simple partial derivative filter as 3x1 instead of 3x1x1. I can get around this by making the filter 3x3x3 and padding zeros, but its less clean:
%Bthree is 121,121,161 3D array
%Now we need to get the derivatives. I will try to convolve a simple linear
%filter function.
dBdX = convn(reshape([-5 0 5],3,1,1),Bthree,'same');
dBdY = convn(reshape([-5 0 5],1,3,1),Bthree,'same');
dBdZ = convn(reshape([-5 0 5],1,1,3),Bthree,'same');
  1 Kommentar
David
David am 25 Okt. 2013
Nevermind... convn actually does add extra singleton dimensions as needed- the reason this wasn't working is that the 'same' option matches to the first matrix, not the second. So this modification works:
dBdX = convn(Bthree,reshape([-5 0 5],3,1,1),'same');
dBdY = convn(Bthree,reshape([-5 0 5],1,3,1),'same');
dBdZ = convn(Bthree,reshape([-5 0 5],1,1,3),'same');

Melden Sie sich an, um zu kommentieren.


Hin Kwan Wong
Hin Kwan Wong am 22 Nov. 2011
64 x 64 x 1 with all due consideration is identical to 64 x 64...
You with see why with zeros(5,5,1), zeros(5,5,2) and zeros(5,5)
It's same as saying data=[5] has dimension 1 as well as 1x1 and 1x1x1 and 1x1x1x1...

Kategorien

Mehr zu Loops and Conditional Statements 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!

Translated by