2013-06-04 18 views
5

MATLAB içindeki matrisleri dizine eklerken, yalnızca ilk veya son n boyutlarını ve diğerlerinin "otomatik olarak seçili" boyutlarını belirleyebilir miyim? Örneğin Bilinmeyen boyutlardaki matrislerde dizin oluşturma için bir sütun kullanma

ben, örneğin bir 3-boyutlu renkli görüntüyü göstermek için ya bir görüntüsünü alır ve imshow ile görüntüleyen bir işlevi, (örneğin, 1024×768×3) veya bir 2-D, tek renkli bir dizi ( yazıyorum 1024x768).
Görüntümün kaç renk kanalının olduğunu umursamıyor, imshow bununla ilgilenecek.

imshow(frame(x1:x2, y1:y2, :)) 

Ben "tüm diğerleri boyutlarını include" söyleyecek son kolonun yerine koymak do Ne: Yapmak istediğim pas parametreleri tek bölgeyi seçmek için mi?

+5

Bu son kolon çalışmıyor mu? Genellikle 'all' – Schorsch

+0

@Schorsch için Matlab sözdizimi doğrudur: [Kolon operatör belgeleri] (http://www.mathworks.com/help/matlab/ref/colon.html) – Doresoom

+2

Hayır, çünkü bu dizinleri doğrusallaştıracak kalan boyutlarda. Örneğin. çerçeve 5 boyutlu ise, bu 3 boyutlu beklendiği gibi 1 boyutlu bir sonuç verecektir. Sebf'in mevcut yapılarında izleyen boyutları korumak istediğini mi sanıyorum? –

cevap

7

Virgülle ayrılmış liste genişletme ile birlikte ':' dizinlemeyi kullanabilirsiniz.

sizin girişidir varsayalım:

cln = {':', ':'}; 
A(cln{:}) 

almak için 3 son:

A = rand([7,4,2,3]); 

sadece ilk 2 almak için

cln = {1, ':', ':', ':'}; 
A(cln{:}) 

ile genelleştirilebilir Hangi:

sten   = 2:3; % Which dims to retrieve 
cln(1:ndims(A)) = {1}; 
cln(sten)  = {':'}; 
A(cln{:}) 
+2

Çok kullanışlı bir numara. İstediğiniz kadar çok sayıya sahip olabileceğinize işaret eden değer, çünkü "yok" gibi sondaki boyutlar için uzunluk 1 olarak kabul edilir. –

+0

Evet, mükemmel bir teknik, teşekkürler Oleg! – sebf

1

Oleg'in yanıtından sonra, ilk boyutların birçoğundan seçiyorsanız, burada çalışacak bir işlevdir. Başka boyutlara ihtiyaç varsa, nasıl değiştirileceğini görebilirsiniz.

function [dat] = getblock2(dat, varargin) 
%[dat] = getblock(dat, varargin) select subarray and retain all others 
%        unchanged 
%dat2 = getblock(dat, [1,2], [3,5]) is equivalent to 
%  dat2 = dat(1:2, 3:5, :, :, :) etc. 
%Peter Burns 4 June 2013 

arg1(1:ndims(dat)) = {':,'}; 
v = cell2mat(varargin); 
nv = length(v)/2; 
v = reshape(v,2,nv)'; 
for ii=1:nv 
    arg1{ii} = [num2str(v(ii,1)),':',num2str(v(ii,2)),',']; 
end 
arg2 = cell2mat(arg1); 
arg2 = ['dat(',arg2(1:end-1),')']; 
dat = eval(arg2); 
İlgili konular