
여기서 (c)를 해결하려하는데 Matlab으로 아무리 코드를 짜봐도 호너의 법칙을 적용하는게 압도적으로 flops가 적음...
the obvious method는 당연히 p(A)b = c_0*b + c_1*A*b + c_2*A*A*b ... 를 의미할텐데
c = [1,2,3,4,5,6,7];
m = 30;
x = ones(m);
b = ones(m, 1);
result = c(1) * eye(m);
power = eye(m);
n = length(c);
flops = 0;
for i = 2:n
temppower = zeros(m, m);
for j = 1:m
for k = 1:m
for l = 1:m
temppower(j, k) = temppower(j, k) + power(j, l) * x(l, k);
flops = flops + 2;
end
% since we're adding the value to 0, we're wasting one addition
% theoretically this isn't necessary so we decrease it
flops = flops - 1;
end
end
power = temppower;
for j = 1:m
for k = 1:m
result(j, k) = result(j, k) + c(i) * power(j, k);
flops = flops + 2;
end
end
end
tempresult = zeros(m, m);
for j = 1:m
for k = 1:m
tempresult(j, k) = tempresult(j, k) + result(j, k) * b(k, 1);
flops = flops + 2;
end
% Same as line #18
flops = flops - 1;
end
result = tempresult;
이게 (a)를 해결하기 위해 짠 코드고 계산했던 (n-1)(2m^3+m^2)+2m^2-m flops랑 일치하는거 보면 코드엔 문제가 없어보임
c = [1,2,3,4,5,6,7];
m = 30;
x = ones(m);
b = ones(m, 1);
n = length(c);
result = c(1) * diag(b);
flops = m;
for i = 2:n
power = eye(m);
for p = 1:i-1
temppower = zeros(m, m);
for j = 1:m
for k = 1:m
for l = 1:m
temppower(j, k) = temppower(j, k) + power(j, l) * x(l, k);
flops = flops + 2;
end
% since we're adding the value to 0, we're wasting one addition
% theoretically this isn't necessary so we decrease it
flops = flops - 1;
end
end
power = temppower;
end
for j = 1:m
for k = 1:m
result(j, k) = result(j, k) + c(i) * power(j, k) * b(k, 1);
flops = flops + 3;
end
end
end
위와 비슷한 방식으로 (c) 를 해결하기 위한 코드를 짰는데 m=30에서 거의 3~4배 flops 차이를 보임
행렬의 곱셈을 여러번 한다는 점에서 애초에 호너의 법칙을 적용하는게 유리해보이는데
왜 문제에서는 호너의 법칙이 연산량에 큰 이득을 주지않는다는거임?