Usando i e j como variables ​​no Matlab

i e j são nomes de variables ​​muito populares (veja, por exemplo, esta questão e esta ).

Por exemplo, em loops:

 for i=1:10, % do something... end 

Como índices em matriz:

 mat( i, j ) = 4; 

Por que eles não deveriam ser usados ​​como nomes de variables ​​no Matlab?

Porque i j são ambas as funções denotando a unidade imaginária :

Então, uma variável chamada i ou j irá substituí-los, potencialmente quebrando silenciosamente o código que faz matemática complexa.

Possíveis soluções incluem o uso de ii e jj como variables ​​de loop, ou usando 1i sempre i for necessário representar a unidade imaginária.

É uma boa prática evitar as variables j para evitar confusão sobre elas serem variables ​​ou a unidade imaginária.

Pessoalmente, no entanto, eu uso i e j como variables, muitas vezes como o índice de loops curtos. Para evitar problemas no meu próprio código, sigo outra boa prática em relação a j : não os use para denotar números imaginários. De fato, a própria documentação do Matlab afirma :

Para maior rapidez e robustez, você pode replace i j complexos por 1i .

Então, ao invés de evitar dois nomes de variables ​​muito comumente usados ​​por causa de um potencial conflito, sou explícito sobre números imaginários. Isso também torna meu código mais claro. Sempre que vejo 1i , sei que representa sqrt(-1) porque não poderia ser uma variável.

Nas antigas versões do MATLAB, costumava haver uma boa razão para evitar o uso de i e j como nomes de variables ​​- as primeiras versões do MATLAB JIT não eram inteligentes o suficiente para dizer se você as estava usando como variables ​​ou como unidades imaginárias, e portanto, desativaria muitas otimizações possíveis.

Seu código ficaria mais lento apenas pela presença de i e j como variables, e aceleraria se você as alterasse para outra coisa. É por isso que, se você ler muito o código MathWorks, verá ii e jj usados ​​de forma bastante ampla como índices de loop. Por um tempo, o MathWorks pode até mesmo ter aconselhado não oficialmente as pessoas a fazerem isso (embora sempre aconselhem oficialmente as pessoas a programarem elegância / manutenção em vez de fazer o que o JIT atual faz, já que é um alvo móvel em cada versão).

Mas isso é há muito tempo, e hoje em dia é um problema de “zumbi” que é muito menos importante do que muitas pessoas ainda pensam, mas se recusa a morrer.

Em qualquer versão recente, é realmente uma preferência pessoal usar ou não i e j como nomes de variables. Se você faz muito trabalho com números complexos, você pode querer evitar i e j como variables, para evitar qualquer pequeno risco potencial de confusão (embora você também possa / em vez disso apenas usar 1i ou 1j para ainda menos confusão, e um pouco melhor desempenho).

Por outro lado, em meu trabalho típico, nunca lidei com números complexos, e acho meu código mais legível se me sinto à vontade para usar i e j como índices de loop.


Eu vejo muitas respostas aqui que dizem Não é recomendado … sem dizer quem está fazendo isso recomendando. Aqui está a extensão das recomendações reais do MathWorks, a partir da documentação atual do lançamento para i :

Como i é uma function, ela pode ser substituída e usada como uma variável. No entanto, é melhor evitar o uso de i e j para nomes de variables, se você pretende usá-los em aritmética complexa. […] Para velocidade e robustez aprimorada, você pode replace i ej complexos por 1i.

Conforme descrito em outras respostas, o uso de i no código geral não é recomendado por dois motivos:

  • Se você quiser usar o número imaginário, ele pode ser confundido com ou substituído por um índice
  • Se você usá-lo como um índice, ele pode overwite ou ser confundido com o número imaginário

Como sugerido: 1i e ii são recomendados. No entanto, embora estes sejam ambos os desvios de i , não é muito bom usar essas duas alternativas juntos.

Aqui está um exemplo porque (pessoalmente) eu não gosto:

 val2 = val + i % 1 val2 = val + ii % 2 val2 = val + 1i % 3 

Não será fácil interpretar mal dois ou três, mas dois e três se assemelham.

Portanto, minha recomendação pessoal seria: No caso de você trabalhar com código complexo, sempre use 1i combinado com uma variável de loop diferente.

Exemplos de índices de letras únicas que, se você não usa muitas variables ​​de loop e letras, são suficientes: t , u , k e p

Exemplo de índices mais longos: i_loop , step , walk e t_now

É claro que isso também é uma questão de gosto pessoal, mas não deve ser difícil encontrar índices para usar que tenham um significado claro sem crescer por muito tempo.

Foi salientado que 1i é uma maneira aceitável e inequívoca de escrever sqrt(-1) , e que, como tal, não há necessidade de evitar o uso de i . Então, novamente, como Dennis apontou ( https://stackoverflow.com/a/14893729/1967396 ), pode ser difícil ver a diferença entre 1i e ii . Minha sugestão: use 1j como a constante imaginária, sempre que possível. É o mesmo truque que os engenheiros elétricos empregam – eles usam o j para o sqrt(-1) porque ii usando a corrente .

Pessoalmente eu nunca uso i e j ; Eu uso ii e jj como variables ​​abreviadas de indexação (e kk, ll, mm, …) e 1j quando preciso usar números complexos.

A confusão com a unidade imaginária foi bem abordada aqui, mas existem algumas outras razões mais prosaicas pelas quais esses e outros nomes de variables ​​de uma única letra são às vezes desencorajados.

  1. MATLAB especificamente: se você estiver usando um programador para gerar fonts C ++ a partir do seu código MATLAB (não, é horrível), então você é explicitamente avisado para não reutilizar variables ​​por causa de potenciais conflitos de digitação.

  2. Geralmente, e dependendo do seu IDE, um nome de variável de uma única letra pode causar estragos com marcadores e pesquisar / replace. O MATLAB não sofre com isso e acredito que o Visual Studio não tem um problema há algum tempo, mas os padrões de codificação C / C ++, como o MISRA etc., tendem a aconselhá-los novamente.

De minha parte, evito todas as variables ​​de uma letra, apesar das vantagens óbvias de implementar diretamente as fonts matemáticas. É preciso um esforço extra nas primeiras centenas de vezes, mas depois disso você para de notar, e as vantagens quando você ou alguma outra pobre alma vem ler seu código são legiões.

Por padrão i e j representam a unidade imaginária. Então, do ponto de vista do MATLAB, usar i como variável é, de alguma forma, como usar 1 como variável.

A menos que você seja um usuário muito confuso, acho que há muito pouco risco em usar os nomes das variables i e j e usá-los regularmente. Eu não vi nenhuma indicação oficial de que essa prática deva ser evitada.

Embora seja verdade que sombrear a unidade imaginária poderia causar alguma confusão em algum contexto, como mencionado em outros posts, no geral, eu simplesmente não a vejo como um grande problema. Existem coisas muito mais confusas que você pode fazer no MATLAB, por exemplo, definindo false=true

Na minha opinião, a única vez que você provavelmente deve evitá-los é se o seu código lida especificamente com números imaginários.

Qualquer código não trivial contém vários loops for e as práticas recomendadas recomendam que você use um nome descritivo indicativo de sua finalidade e escopo. Por tempos imemoriais (e a menos que seu script de 5-10 linhas que eu não estou indo para salvar), eu tenho sempre usado nomes de variables ​​como idxTask , idxAnotherTask e idxSubTask etc.

Ou, no mínimo, duplicando a primeira letra da matriz, indexe eg para indexar subjectList , tt para index taskList , mas não ii ou jj que não me ajude a identificar facilmente qual array eles estão indexando em meus múltiplos loops for .