UPD: 保研弄得差不多了,开始学习别人优秀代码...然后再总结总结... 2013.9.18
暑假想练一下matlab,就想像练C++一样找一个可以刷题的OJ。
很幸运的是,matlab官网上就有:
http://www.mathworks.com/matlabcentral/cody
花了些时间刷了一下上面的入门题(Problem Groups里面的Cody Challenge),基本上都是模拟题。
下面贴一些自己做过的题目和总结一下比较有用的函数。Problem 1 - Problem 10
Problem 1. Times 2 -START HERE
就像a+b一样简单,这题只要让我们把输入的数乘以2。重点是提交的源代码文件需要是一个函数。
function y = times2(x)
y = x*2;
Problem 2. Make the vector [1 2 3 4 5 6 7 8 9 10]
function x = oneToTen
x = 1:10;
用:或者函数linspace就可以实现。
Problem 3. Find the sum of all the numbers of the input vector
function y = vecsum(x)
y = sum(x);
用函数sum.
Problem 4. Make a checkerboard matrix
弄一个01相间的矩阵。
Gfunction a = checkerboard(n)
a = repmat(eye(2), n, n);
a = a(1:n, 1:n); 完全是为了用repmat写的。
repmat(A, M, N)返回一个M行N列个A组成的矩阵,size为[size(A,1)*M, size(A,2)*N]。
eye(N)返回一个N*N的单位矩阵。
UPD: Leading solution是利用逆希尔伯特矩阵元素的正负性写的,没有太多参考性...
invhilb(n)返回一个n阶的逆希尔伯特矩阵。
Problem 5. Triangle Numbers
function t = triangle(n)
t = n*(n+1)/2;
Problem 6. Secelt every other element of a vector
function y = everyOther(x)
y = x(1:2:length(x));
length(x)返回向量x的长度。
UPD: 直接用end应该是比较好的做法...
function y = everyOther(x)
y = x(1:2:end);
Problem 7. Column Removal
function B = column_removal(A, n)
s = size(A);
B = [A(:,1:(n-1)), A(:,(n+1):s(2))]; 删除某列的新矩阵,就是由原来的1到n-1列和n+1列到size(A, 2)列组成的矩阵。
size(A)返回A各维的长度。对于M*N矩阵,size(A,1) = M, size(A,2) = N。
UPD: 可以直接把第n列变为空...
function A = column_removal(A, n)
A(:,n) = '';
Problem 8. Add two numbers
function c = add_two_numbers(a,b)
c = a + b; a+b来啦。
Problem 9. Who Has the Most Change?
function b = most_change(a)
mxmon = 0; b = [];
sa = size(a);
for k = 1:sa(1)
now = 0.25*a(k,1) + 0.05*a(k,2) + 0.10*a(k,3) + 0.01*a(k,4);
if now > mxmon
mxmon = now;
b = k;
elseif now == mxmon
b = [b k];
end
end
不知道是否有简便写法。
UPD:
Leading solution的做法: 先用矩阵乘法算出每个人的钱数,然后用max()函数统计最大值的下标。
function b = most_change(a)
[~, b] = max(a*[0.25; 0.05; 0.1; 0.01]);
Problem 10. Determine whether a vector is monotonically increasing
function tf = mono_increase(x)
tf = true;
for k = 2:length(x)
if x(k) - x(k - 1) <= 0
tf = false;
end
end
判断一个数列是否严格递增。同上。
UPD: 更简洁的做法。
function ans = mono_increase(x)
all(diff(x) > 0);
end
都是非常简单的题目,纯为练函数。今天先贴到这里。
如果有更为简单的方法,请给我留言,谢谢!
允许转载,转载请注明出处: http://blog.csdn.net/lkjslkjdlk/article/details/10118203