我正在编写代码,根据给定的参数确定各种收入水平的税收值:
我想通过显示以下收入的正确值来测试每个案例:
$ 5,000,$ 10,000,$ 11,000,$ 15,000,$ 30,000和$ 100,000。
目标
使用if-else梯子解决上述问题陈述。我已经完成了这个,见下文。
使用if-else梯形图的逻辑向量INSTEAD再次解决相同的问题陈述。
到目前为止的代码
我通过使用if-else梯子找到每个收入的税收来完成第一个目标:
%% Setting up the Vector
A = [5000; 10000; 11000; 15000; 30000; 100000];
%% Now to calculate the Tax
loopend = size(A);
for i=1: loopend
income(i) = A(i); %Sets the income equal to the values in vector A
if (income(i) <= 10000)
tax{i} = 0.1*income(i) ;
elseif (income(i) <= 20000)
tax{i} = 1000+(0.2*(income(i)-10000)) ;
elseif (income(i) > 20000)
tax{i} = 3000+(0.5*(income(i)-20000)) ;
end
end
%% Time to display our perfect results
display(tax);
%% But how do we do it with logical vectors instead?
我迷失在如何通过使用逻辑向量或逻辑结构解决这个问题(说实话,我不完全确定这意味着什么)。非常感谢帮助。
答案 0 :(得分:1)
除此之外:我不想在这个税制中加薪从$ 1.k到$ 20,000,这将是$ 2k的薪水减少 ...你确定这些括号是正确的吗? ?因为它们肯定不现实!
首先,关于循环方法的一些注意事项,请参阅我的评论:
% Use numel for a 1D array, or size(A,2) for number of columns. size(A) = [1, 2], not 2
loopend = numel(A);
% Always try to initialise your output array to the desired size
tax = zeros(1, loopend)
% Try to avoid using i or j as a loop variable, i=j=sqrt(-1) by default in MATLAB
for ii=1:loopend
% You were replicating A in the vector income, either just use A(ii) or set to a scalar
income = A(ii);
if (income <= 10000)
% tax is a numerical array, not a cell array, use parentheses () not braces {}
tax(ii) = 0.1*income;
elseif (income <= 20000)
tax(ii) = 1000+(0.2*(income-10000)) ;
elseif (income > 20000)
tax(ii) = 3000+(0.5*(income-20000)) ;
end
end
我不确定你为什么编写“逻辑向量(结构)”,因为结构和局部向量在MATLAB中是不同的数据类型! {{3}}是一种广泛的数据类型,在此不会对您有所帮助。我认为问题是要求您逻辑地构建代码而不是使用逻辑结构数据类型。
以下是我用逻辑数组解决这个问题的方法:
% lower limits of the tax brackets, and their corresponding costs.
taxbands = [0, 10000, 20000;
0.1, 0.2, 0.5;
0 1000, 3000];
% initialise output
tax = zeros(1, numel(A));
% Assign result per tax band
for ii = 1:size(taxbands,2)
% Get the logical indices of incomes at (or above) this tax band
idx = (A > taxbands(1,ii));
% Calculate tax for all incomes in this band
tax(idx) = taxbands(3,ii) + taxbands(2,ii)*(A(idx)-taxbands(1,ii));
end
你可以通过在创建idx
时使用上限来提高后一个代码的效率,也许使用inf
作为最高上限,这样你就不会在每个收入的括号。