使用逻辑向量替换MATLAB中的if-else梯形图

时间:2017-10-27 03:54:40

标签: matlab logic

我正在编写代码,根据给定的参数确定各种收入水平的税收值:

  • 应课税收入$ 10,000或以下: 税是应纳税所得额的10%。
  • 应税收入超过10,000美元且低于或等于20,000美元: 税是应税收入超过10,000美元的1000美元+ 20%。
  • 应税收入超过20,000美元: 税是3,000美元+应税收入超过20,000美元的50%。

我想通过显示以下收入的正确值来测试每个案例:
$ 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?

我迷失在如何通过使用逻辑向量或逻辑结构解决这个问题(说实话,我不完全确定这意味着什么)。非常感谢帮助。

1 个答案:

答案 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作为最高上限,这样你就不会在每个收入的括号。