i
e j
são nomes de variáveis muito populares (veja, por exemplo, esta pergunta e esta ).
Por exemplo, em loops:
for i=1:10,
% do something...
end
Como índices na matriz:
mat( i, j ) = 4;
Por que eles não deveriam ser usados como nomes de variáveis no Matlab?
i
,j
,k
como os nomes de variáveis de loop genéricos.Respostas:
Porque
i
ej
são as duas funções que denotam a unidade imaginária :Portanto, uma variável chamada
i
ouj
irá substituí-los, potencialmente silenciosamente quebrando código que faz matemática complexa.As soluções possíveis incluem usar
ii
ejj
como variáveis de loop ou usar1i
sempre quei
necessário para representar a unidade imaginária.fonte
i
ej
variável nomes.for
loop 1 bilhão de vezes não mostram diferença estatística no tempo). Pelo que sabemos, existe um código especial para lidar exatamente com isso e o uso de variáveis diferentes dei
ej
(ek
?) É realmente um pouco mais lento. E as diferenças que existem são minúsculas ou inexistentes na vida real. Simplesmente não há razão para NÃO usari
ej
como variáveis regulares - elas apenas precisam ser usadas corretamente como qualquer outra função do Matlab.for
loop 1 bilhão de vezes e tentar todos os tipos de esquemas de temporização. Estou vendo que novos usuários de SO são informados de que um código perfeitamente válido está errado porque eles estão usandoi
ej
para repetir loops. Francamente, é bobagem e as pessoas estão perdendo o ponto mais importante dessa pergunta: issoi
nemj
deveria ser usado para a unidade imaginária, se alguém quiser escrever um código Matlab moderno e legível.É uma boa prática evitar
i
ej
variáveis para evitar confusão sobre serem variáveis ou a unidade imaginária.Pessoalmente, porém, eu uso
i
ej
como variáveis com bastante frequência o índice de loops curtos. Para evitar problemas no meu próprio código, sigo outra boa prática a respeitoi
ej
: não os use para indicar números imaginários. De fato, a documentação do Matlab afirma :Portanto, em vez de evitar dois nomes de variáveis muito comumente usados por causa de um conflito em potencial, sou explícito sobre números imaginários. Isso também torna meu código mais claro. Sempre que vejo
1i
, sei que representasqrt(-1)
porque não poderia ser uma variável.fonte
1i
. No entanto, alterar o significadoi
ej
pode levar a erros difíceis de depurar, como este .i
e evitarj
, mas expliquei como meu estilo de codificação pessoal não segue essa regra.1i
e nãoi
para matemática complexa. Vamos pensar no número imaginário como1i
e tomari
como número imaginário uma má prática. Não o contrário. Usandoi
,ii
,iii
é prática comum em Matlab e não há nenhum problema quando as pessoas ficar com1i
e1j
para o número complexo. Além disso, o Matlab respeita isso e este não diminui o desempenho (tanto quanto eu testei), como indicado na resposta anterior.Nas versões antigas do MATLAB, costumava haver um bom motivo para evitar o uso de
i
ej
como nomes de variáveis - as versões anteriores do MATLAB JIT não eram suficientemente inteligentes para saber se você as estava usando como variáveis ou como unidades imaginárias, e portanto desative muitas otimizações possíveis.Seu código, portanto, ficaria mais lento apenas pela presença
i
ej
como variáveis, e aceleraria se você as alterasse para outra coisa. É por isso que, se você ler muitos códigos do MathWorks, veráii
e serájj
usado amplamente como índices de loop. Por um tempo, o MathWorks pode até ter aconselhado não oficialmente as pessoas a fazerem elas mesmas (embora elas sempre aconselhem oficialmente as pessoas a programarem por elegância / manutenção, em vez de fazer o que o JIT atual faz, pois é um alvo móvel em cada versão).Mas isso já faz muito tempo, e hoje em dia é uma questão de "zumbi" que é realmente 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
i
ouj
como nomes de variáveis ou não. Se você trabalha muito com números complexos, convém evitar,i
ej
como variáveis, evitar qualquer pequeno risco potencial de confusão (embora você também queira / em vez disso use apenas1i
ou1j
ainda menos confusão e desempenho um pouco melhor) )Por outro lado, em meu trabalho típico, nunca lido com números complexos e acho meu código mais legível se me sentir livre para usar
i
ej
como índices de loop.Eu vejo muitas respostas aqui que dizem: Não é recomendado ... sem dizer quem está fazendo isso. Aqui está a extensão das recomendações reais do MathWorks, a partir da documentação atual para
i
:fonte
Conforme descrito em outras respostas, o uso de
i
código geral não é recomendado por dois motivos:Como sugerido:
1i
eii
são recomendados. No entanto, embora esses dois desvios sejam excelentesi
, não é muito bom usar essas duas alternativas juntas.Aqui está um exemplo do porquê (pessoalmente) eu não gosto:
Um não será facilmente interpretado mal por dois ou três, mas dois e três se assemelham.
Portanto, minha recomendação pessoal seria: Caso você às vezes trabalhe com código complexo, use sempre
1i
combinado com uma variável de loop diferente.Exemplos de índices de uma única letra que, para se você não usar muitas variáveis de laço e letras bastam:
t
,u
,k
ep
Exemplo de índices mais longos:
i_loop
,step
,walk
, et_now
É claro que isso também é uma questão de gosto pessoal, mas não deve ser difícil encontrar índices de uso que tenham um significado claro, sem crescer muito.
fonte
1i
vai ser de cor diferente como um número :)doc i
edoc j
: "Para velocidade e robustez aprimorada, você pode substituir o complexo iej por 1i." Na IMO, no Matlab atual, não há razão para não usari
ej
em loops, etc., ou usar algo diferente de1i
denotar a unidade imaginária (1j
funciona também). A única exceção é ao passar seqüências de caracteres para o mecanismo simbólico sempre um pouco incompatível. Estranho quehelp 1i
edoc 1i
não funciona embora.Foi apontado que
1i
é uma maneira aceitável e inequívoca de escreversqrt(-1)
, e que, como tal, não há necessidade de evitar o usoi
. Por outro lado, como Dennis apontou ( https://stackoverflow.com/a/14893729/1967396 ), pode ser difícil ver a diferença entre1i
eii
. Minha sugestão: use1j
como constante imaginária sempre que possível. É o mesmo truque que engenheiros empregam - eles usamj
parasqrt(-1)
porquei
já está tomada de corrente .Pessoalmente eu nunca uso
i
ej
; Eu usoii
ejj
como variáveis de indexação abreviada (e kk, ll, mm, ...) e1j
quando preciso usar números complexos.fonte
1i
eii
" E ainda mais a diferença entre1
el
e entreO
e0
. É por isso que a primeira etapa que eu faço em uma nova instalação do MATALB é alterar o tamanho da fonte padrão.A confusão com a unidade imaginária foi bem abordada aqui, mas há outras razões mais prosaicas pelas quais esses e outros nomes de variáveis de letra única são algumas vezes desencorajados.
MATLAB especificamente: se você estiver usando o codificador para gerar a fonte C ++ a partir do seu código MATLAB (não, é horrível), será explicitamente avisado para não reutilizar variáveis devido a possíveis conflitos de digitação.
Geralmente, e dependendo do seu IDE, um nome de variável de uma letra pode causar estragos nos marcadores e pesquisar / substituir. O MATLAB não sofre com isso e acredito que o Visual Studio não tenha um problema há algum tempo, mas os padrões de codificação C / C ++ como MISRA etc. tendem a aconselhá-los.
Pela minha parte, evito todas as variáveis de letra única, apesar das vantagens óbvias para implementar diretamente fontes matemáticas. É preciso um pouco de esforço extra nas primeiras centenas de vezes que você faz isso, mas depois disso você para de notar, e as vantagens quando você ou alguma outra alma pobre chega a ler seu código são numerosas.
fonte
Qualquer código não trivial contém vários
for
loops e as práticas recomendadas recomendam o uso de um nome descritivo indicativo de sua finalidade e escopo. Por vezes imemoriais (e menos que seu 5-10 linhas de script que eu não estou indo para salvar), eu sempre têm vindo a utilizar nomes de variáveis comoidxTask
,idxAnotherTask
eidxSubTask
etc.Ou, no mínimo, dobrando a primeira letra da matriz que está indexando, por exemplo ,
ss
indexarsubjectList
,tt
indexartaskList
, mas nãoii
oujj
que não me ajuda a identificar sem esforço qual matriz eles estão indexando do meu múltiplo para loops.fonte
Por padrão
i
ej
defina a unidade imaginária. Portanto, do ponto de vista do MATLAB, usari
como variável é como usar1
como variável.fonte
i
ej
são realmente retornando o valor da unidade imaginária. É possível usar uma variável com o mesmo nome que uma função em um escopo. No entanto, isso sombreará a função.A menos que você é um usuário muito confuso Eu acho que existe muito pouco risco na utilização de nomes de variáveis i e j e eu usá-los regularmente. Não vi nenhuma indicação oficial de que essa prática deva ser evitada.
Embora seja verdade que a sombra da unidade imaginária possa causar alguma confusão em algum contexto, como mencionado em outras postagens, no geral, simplesmente não a vejo como um problema importante. Há muito mais coisas confusas que você pode fazer no MATLAB, por exemplo, definir
false=true
Na minha opinião, o único momento em que você provavelmente deve evitá-los é se o seu código lida especificamente com números imaginários.
fonte
i
é uma função, ele pode ser substituído e usado como uma variável. No entanto, é melhor evitar o usoi
ej
para nomes de variáveis, se você pretende usá-los em aritmética complexa." Que, em conjunto com o comentário de Eitan T sobre a resposta de Oliver (acho que ele cronometrou), parece prova suficiente.