Contents
Downsize an array using different methods
clear; % load an RBG image: 135-by-198-by-3 array I = imread('onion.png'); disp(size(I)); figure; imagesc(I);
135 198 3
Set target dimension
targetdim = round([100 150 3]); disp(targetdim);
100 150 3
Downsize using interpolation
I_interp = array_resize(I, targetdim); %<-- default method is interpolate
disp(size(I_interp));
figure; imagesc(I_interp);
100 150 3
Downsize using discrete cosine transform (DCT)
I_dct = array_resize(I, targetdim, 'method', 'dct'); disp(size(I_dct)); figure; imagesc(I_dct);
100 150 3
Downsize to PCA scores using HOSVD. PC scores loose original interpretation
I_hosvd = array_resize(I, targetdim, 'method', 'hosvd'); disp(size(I_hosvd)); figure; imagesc(I_hosvd);
100 150 3
Downsize to PCA scores using marginal SVD. PC scores loose original interpretation
I_2dsvd = array_resize(I, targetdim, 'method', '2dsvd'); disp(size(I_2dsvd)); figure; imagesc(I_2dsvd);
100 150 3
Upsize an array using different methods
Set target dimension
targetdim = round([200 300 3]); disp(targetdim);
200 300 3
Upsize using interpolation
I_interp = array_resize(I, targetdim); %<-- default method is interpolate
disp(size(I_interp));
figure; imagesc(I_interp);
200 300 3
Upsize using discrete cosine transform (DCT)
I_dct = array_resize(I, targetdim, 'method', 'dct'); disp(size(I_dct)); figure; imagesc(I_dct);
200 300 3
Downsizing-analysis-upsizing
clear; % reset random seed s = RandStream('mt19937ar','Seed',2); RandStream.setGlobalStream(s);
True coefficients for regular (non-array) covariates
p0 = 5; b0 = ones(p0,1);
2D true signal: 64-by-64 cross
shape = imread('cross.gif'); shape = array_resize(shape,[32,32]); % 32-by-32 b = zeros(2*size(shape)); b((size(b,1)/4):(size(b,1)/4)+size(shape,1)-1, ... (size(b,2)/4):(size(b,2)/4)+size(shape,2)-1) = shape; [p1,p2] = size(b); disp(size(b)); figure; imagesc(-b); colormap(gray); title('True Signal'); axis equal; axis tight;
64 64
Simulate covariates
n = 500; % sample size X = randn(n,p0); % n-by-p0 regular design matrix M = tensor(randn(p1,p2,n)); % p1-by-p2-by-n matrix variates disp(size(M));
64 64 500
Simulate responses
mu = X*b0 + double(ttt(tensor(b), M, 1:2));
sigma = 1; % noise level
y = mu + sigma*randn(n,1);
Rank 2 Kruskal regression with 64-by-64 covariates
tic; [~,beta1,glmstats1] = kruskal_reg(X,M,y,2,'normal'); toc; disp(size(beta1)); figure; imagesc(-double(beta1)); colormap(gray); title('Estimate using 64x64 covariates'); axis equal; axis tight;
Elapsed time is 1.884143 seconds. 64 64
Resize 2D covariates to 32-by-32
M_reduce = array_resize(double(M), [32 32 n], 'method', 'dct'); disp(size(M_reduce));
32 32 500
Rank 2 Kruskal regression with 32-by-32 covariates
tic;
[~,beta2,glmstats2] = kruskal_reg(X,M_reduce,y,2,'normal');
toc;
disp(size(beta2));
Elapsed time is 0.366865 seconds. 32 32
Resize estimate and disp in original size
beta2 = array_resize(double(beta2), [64 64], 'method', 'dct'); disp(size(beta2)); figure; imagesc(-double(beta2)); colormap(gray); title('Estimate using 32x32 covariates'); axis equal; axis tight;
64 64