2013-11-03 50 views
1

爲了學習練習,我需要使用逐個元素函數來構建一個乘法表10x10,並儘可能縮短它。 這是我寫的代碼(工作但太長),請給這段代碼建議一些twicks。 在此先感謝(:在matlab中構建乘法表

base=zeros(10); 
oneten=[1:1:10]; 
base(1,:)=1.*oneten; 
base(2,:)=2.*oneten; 
base(3,:)=3.*oneten; 
base(4,:)=4.*oneten; 
base(5,:)=5.*oneten; 
base(6,:)=6.*oneten; 
base(7,:)=7.*oneten; 
base(8,:)=8.*oneten; 
base(9,:)=9.*oneten; 
base(10,:)=10.*oneten 
+0

在你的榜樣,你不需要使用元素逐個元素相乘作爲由向量乘以標量。 '1 * oneten'將給出與'1. * oneten'相同的輸出。 – David

+0

'使用元素功能'不是很清楚。如果您的答案需要包含元素操作,則可以通過乘以'。* 1'來簡單地結束您的解決方案。如果你只被允許使用元素操作,那麼丹尼爾的第二個解決方案可能是最好的。 –

+0

我會像francesco一樣回答,因爲向量外積可以說是解決這個任務的最自然的方式,但是Daniel的解決方案似乎更快一些:'bsxfun(@times,one_to_n,one_to_n')'。也給丹尼爾的榮譽。 – chappjc

回答

4

做這樣的事情:

(1:10)' * (1:10) 

編輯--->

我已經測試解決方案由丹尼爾建議的速度,我,路易斯門多和大衛,當N很大時:

N = 100; % number of iterations 
runtime_a = zeros(N, 1); % runtime of Daniel's solution 
runtime_b = zeros(N, 1); % runtime of the obvious solution 
runtime_c = zeros(N, 1); % runtime of Luis Mendo's solution 
runtime_d = zeros(N, 1); % runtime of Luis Mendo's solution 
runtime_e = zeros(N, 1); % runtime of David's solution 
n = 5000; % number of elements 
one_to_n = 1:n; 
for hh = 1:N 
    % Solution by Daniel R. 
    tic, a = bsxfun(@times, one_to_n, one_to_n'); runtime_a(hh) = toc; 
    clear a 
    tic, b = one_to_n' * one_to_n; runtime_b(hh) = toc; 
    clear b 
    % Solution by Luis Mendo 
    tic, c = cell2mat(arrayfun(@(x) (x:x:n*x).', one_to_n, 'uni', false)); runtime_c(hh) = toc; 
    clear c 
    % Solution by Luis Mendo. 
    tic, d = cumsum(repmat(one_to_n, [n 1])); runtime_d(hh) = toc; 
    clear d 
    % Solution by David 
    tic, [A, B] = meshgrid(one_to_n); e = A.*B; runtime_e(hh) = toc; 
    clear e 
end 

% Check mean and standard deviation: 
mean([runtime_a, runtime_b, runtime_c, runtime_d, runtime_e]) 
std([runtime_a, runtime_b, runtime_c, runtime_d, runtime_e]) 

結果是:

% mean: 
0.105048900691251 0.188570704057917 0.491929288458701 0.787045026437718 0.979624197407329 
% standard deviation: 
0.034274873626281 0.077388368324427 0.163983982925543 0.285395301735065 0.372693172505310 

因此,顯然,當N很大時,Daniel的解決方案是最快的。

+0

這是最短的方法,只要逐元素乘法不是必需的。 – David

+1

'one_to_n'* one_to_n'比'bsxfun(@times,one_to_n,one_to_n')'慢,這是完全奇怪的。我的意思是,我喜歡'bsxfun',但這看起來很悲慘。 – chappjc

+0

(其實我也很震驚!) – 2013-11-04 23:45:40

1
oneten=[(1:10)] 
base = bsxfun(@times,oneten,oneten') 

預分配(base=zeros(10);)在這種情況下是不安全的。

而另一種解決方案是比較容易理解:

base=zeros(10); 
oneten=[(1:10)]; 
for k=oneten 
    base(k,:)=k.*oneten; 
end 
2

只是爲了好玩:其他的可能性是

  • cumsum(repmat(1:10,[10 1])) 
    
  • cell2mat(arrayfun(@(n) (n:n:10*n).',1:10,'uni',false)) 
    
0
[A,B]=meshgrid(1:10); 
A.*B 

用途元素的元素被使用嵌套的for循環乘法

0

我的回答:

for i = (1:10) 
    for j = (1:10) 
     fprintf('%d\t',i*j); 
    end 
    fprintf('\n'); 
end 

我認爲這會幫助你。
來源:Radius Of Circle