Yerli bir dəyişən təyin etmədən bir funksiya tərəfindən qaytarılmış MATLAB dizisini necə endirə bilərəm?

Məsələn, magic(5) ortalama magic(5) oxumaq magic(5) , bunu belə edə bilərəm:

 M = magic(5); value = M(3,3); 

value == 13 almaq value == 13 . Mən bu kimi bir şey etmək istərdim:

 value = magic(5)(3,3); value = (magic(5))(3,3); 

aralıq dəyişənləri silmək. Bununla belə, MATLAB Unbalanced or unexpected parenthesis or bracket 3 ün qarşısında ilk bracketə şikayət edir.

Bir dəyişən təyin etmədən bir sıra / matrisdən dəyərləri oxumaq mümkündürmü?

306
02 сент. Joe Kearney soruşdu 02 Sep 2010-09-02 15:34 '10 at 15:34 2010-09-02 15:34
@ 9 cavab

Əslində istədiyinizi edə bilərsiniz, ancaq indeks operatorunun funksional formasını istifadə etməlisiniz. Bir index əməliyyatını () ilə yerinə yetirərkən, həqiqətən subsref funksiyasını subsref . Beləliklə, bunu edə bilməsə də:

 value = magic(5)(3, 3); 

Bunu edə bilərsiniz:

 value = subsref(magic(5), struct('type', '()', 'subs', {{3, 3}})); 

Çirkin, lakin mümkündür;);

Ümumiyyətlə, birbaşa aşağıdakı iki parantez dəstiniz olmadığı üçün, bir funksiya çağırışına endeksleme addımını dəyişdirməlisiniz. Bunun bir başqa yolu indeksləşdirilmiş indeksləşdirmə etmək üçün öz anonim funksiyanı müəyyən etməkdir. Məsələn:

 subindex = @(A, r, c) A(r, c); % An anonymous function for 2-D indexing value = subindex(magic(5), 3, 3); % Use the function to index the matrix 

Ancaq bütün bunlar edildiyi və edildiyi zaman, yerli bir dəyişənə müvəqqəti bir həll çox oxunaqlı və əlbəttə ki, təklif edərdim.

338
02 сент. cavab gnovice verildi 02 Sep 2010-09-02 18:57 '10 at 18:57 2010-09-02 18:57

Bir neçə gün əvvəl Matlab sənətində Laurendə yaxşı bir blog yazısı var idi ki, bu da kömək edə biləcək bir cüt daşıyıcı ilə. Xüsusilə, aşağıdakı kimi köməkçi funksiyaları istifadə etməklə:

 paren = @(x, varargin) x(varargin{:}); curly = @(x, varargin) x{varargin{:}}; 

paren() kimi istifadə edilə bilər

 paren(magic(5), 3, 3); 
border=0

dönəcək

 ans = 16 

Mən də gnovice cavabından daha sürətli olacağını düşünürəm, amma bunu yox etdim (profilerdən istifadə edin !!!). Bununla yanaşı, bu funksiya müəyyənləşdirmələri də daxil etməlisiniz. Mən şəxsən onları yolunda müstəqil funksiyaları etdik, çünki onlar çox faydalıdır.

Bu funksiyalar və digər funksiyalar artıq MADLAB Add-On Explorer və ya Fayl Dövrü vasitəsilə əldə edilə bilən Əlavə Funksional Proqramlaşdırılan Tasarımcılarda mövcuddur.

113
11 февр. Cavab 11 fevralda T. Furfaro tərəfindən verilir . 2013-02-11 15:08 '13 at 15:08 2013-02-11 15:08

Sənədsiz funksiyaları istifadə etməyinizə dair necə düşünürsünüz?

 >> builtin('_paren', magic(5), 3, 3) %# M(3,3) ans = 13 

və ya hüceyrə serialları üçün:

 >> builtin('_brace', num2cell(magic(5)), 3, 3) %# C{3,3} ans = 13 

Sehrli kimi :)


ƏLAVƏ OLUNUB:

Xəbərlər, yuxarıda göstərilən hacking artıq R2015b -də işləmir ! Bu gözəl, sənədsiz bir funksiyasiyadır və biz ona dəstəklənən funksiya kimi etibar edə bilmirik :)

Bu cür şeyi tapmaq üçün merak edənlər üçün fullfile(matlabroot,'bin','registry') qovluğuna baxın fullfile(matlabroot,'bin','registry') . Bütün yaxşılıq növlərini göstərən bir neçə XML fayl var. Bu funksiyaların bir hissəsini birbaşa MATLAB sessiyasını çökə bilər ki, xəbərdar olun.

74
25 апр. cavab Amro 25 apr verilir . 2013-04-25 19:39 '13 at 19:39 2013-04-25 19:39

Ən azı MATLAB 2013-də getfield istifadə edə bilərsiniz:

 a=rand(5); getfield(a,{1,2}) % etc 

elementi əldə etmək üçün (1,2)

46
09 авг. Ian M. García 09 aug tərəfindən verilmiş cavab . 2013-08-09 22:15 '13 saat 10:15 'da 2013-08-09 22:15

Təəssüf ki, tipli magic(5)(3,3) sintaksis magic(5)(3,3) matris tərəfindən dəstəklənmir. müvəqqəti ara dəyişənlərdən istifadə etməlisiniz. məsələn, istifadədən sonra yaddaşı azad edə bilərsiniz.

 tmp = magic(3); myVar = tmp(3,3); clear tmp 
15
02 сент. cavab 02 sentyabr tarixində verilir. 2010-09-02 15:46 '10 at 15:46 2010-09-02 15:46

İcra müddətini standart metodla müqayisə etsəniz (nəticə verin və sonra qeydləri yazın) tam olaraq eyni olacaq.

 subs=@(M,i,j) M(i,j); >> for nit=1:10;tic;subs(magic(100),1:10,1:10);tlap(nit)=toc;end;mean(tlap) ans = 0.0103 >> for nit=1:10,tic;M=magic(100); M(1:10,1:10);tlap(nit)=toc;end;mean(tlap) ans = 0.0101 

Mənim fikrimcə, bu nöqtə: MATLAB heç bir göstəricisi yoxdur, bununla yaşamaq lazımdır.

12
02 февр. Cavab titus verildi 02 fevral. 2012-02-02 19:32 '12 at 7:32 pm 2012-02-02 19:32

Yeni funksiya yaratsanız, bu daha asan ola bilər:

 function [ element ] = getElem( matrix, index1, index2 ) element = matrix(index1, index2); end 

və sonra istifadə:

 value = getElem(magic(5), 3, 3); 
6
01 мая '13 в 19:54 2013-05-01 19:54 cavab Vüqar 01 may '13 saat 19:54 'da verilir 2013-05-01 19:54

Orijinal qeydiniz bunu etmək üçün ən qısa yoludur:

 M = magic(5); %create value = M(3,3); % extract useful data clear M; %free memory 

Bunu bir döngədə edərsənsə, hər dəfə M-ni xatırlayır və aydın ifadəni görməyəcəksiniz.

4
20 авг. Andreas GS tərəfindən verilmiş cavab 20 av. 2012-08-20 21:16 '12 at 21:16 2012-08-20 21:16

Amro-nun cavabını tamamlamaq üçün, feval əvəzinə feval istifadə edə bilərsiniz. Əslində, operator funksiyasını çox yükləməyə cəhd etməsəniz fərq yoxdur:

BUILTIN (...) FEVAL (...) ilə eynidır, istisna olmaqla, funksiyanın orijinal daxili versiyasını çağırır, həddindən artıq yüklənmiş olsa da (bu, işləmək üçün BUILTIN-ni heç vaxt yükləməməlisiniz).

 >> feval('_paren', magic(5), 3, 3) % M(3,3) ans = 13 >> feval('_brace', num2cell(magic(5)), 3, 3) % C{3,3} ans = 13 

Maraqlıdır ki, feval , ən azı Matlab 2013b-də, bu funksiyanı aşırı yüklənmiş vəziyyətdə yoxsa yoxsa feval , nəzərə alınmaqla, nəzərə alınmaqla, (məsələn, ~ 3.5%) bir qədər qısa görünür:

 >> tic; for i=1:1e6, feval('_paren', magic(5), 3, 3); end; toc; Elapsed time is 49.904117 seconds. >> tic; for i=1:1e6, builtin('_paren', magic(5), 3, 3); end; toc; Elapsed time is 51.485339 seconds. 
1
12 мая '16 в 23:54 2016-05-12 23:54 cavab nirvana- msu tərəfindən 12 May '16, 23:54 2016-05-12 23:54 'də verilir