Eu tenho muito código MATLAB que precisa ser portado para C (a velocidade de execução é crítica para este trabalho) como parte de um processo de back-end para um aplicativo Web. Quando tento terceirizar esse código para um desenvolvedor C, presumo (me corrija se estiver errado) que poucos desenvolvedores C também entendam o código MATLAB (coisas como indexação e gerenciamento de memória são diferentes etc.). Gostaria de saber se existem desenvolvedores C por aí que possam recomendar um procedimento para eu seguir para melhor comunicar o que o código faz?
Por exemplo, devo fornecer o código MATLAB e explicar o que está fazendo linha por linha? Ou devo apenas fornecer matemática / algoritmo, explicá-lo em inglês simples e permitir que o desenvolvedor C o implemente com esse entendimento à sua maneira (por exemplo, posso assumir que o desenvolvedor entende como trabalhar com matemática complexa (por exemplo, imaginária) números), como gerar histogramas, realizar uma FFT, etc.)?
Ou existe um método melhor? Espero que não seja o primeiro a fazer isso, então me pergunto se algum desenvolvedor de C enfrentou essa situação e pode compartilhar qualquer sabedoria convencional de como eles gostariam que essa tarefa fosse transferida.
Agradecemos antecipadamente por quaisquer comentários.
mcc -c matlabfile.m
Respostas:
Estou em uma situação semelhante à sua, pois também tenho pessoas portando meu código Matlab para C ++.
Depende muito da complexidade do seu código, bem como do nível de habilidade do desenvolvedor de C / C ++ e do entendimento do que eles devem implementar - quanto melhores eles são e quanto melhor eles entendem o seu problema, mais independentemente eles podem trabalhar.
Como a tradução direta do código Matlab para C / C ++ pode não ser a maneira mais eficiente de lidar com um problema, sugiro que você comunique bem qual é a entrada, o que o código deve fazer e o que deve retornar como saída. Você também deve fornecer maneiras de testar o código para garantir que ele funcione corretamente - tanto para ajudar na depuração quanto para fornecer um meio de controle de qualidade. Além disso, você deve fornecer e explicar o código do Matlab como uma diretriz aproximada de como o resultado pode ser alcançado.
Você deve assumir que o desenvolvedor sabe como estruturar um programa e como usar as ferramentas de depuração. No entanto, talvez você não consiga necessariamente assumir que o desenvolvedor sabe ter conhecimentos específicos, digamos, estatísticas ou otimização (matemática). Portanto, a depuração dessas partes será muito mais rápida com a sua entrada.
Pode ajudar a agendar reuniões regulares com o desenvolvedor, para que "pequenas coisas" que possam parecer um pouco estranhas para o desenvolvedor, mas que sinalizem problemas importantes para você, possam ser comunicadas antes que se transformem em grandes problemas.
fonte
Não estou dizendo que isso se aplica a você, mas: A maioria das pessoas que apenas codificam no MATLAB escrevem códigos incorretos. Muito ruim, com má formatação, estrutura e documentação.
Nesse caso, a única maneira fácil de usar o código MATLAB é executá-lo para verificar os resultados do código portado. Tentar fazer engenharia reversa do código MATLAB sem documentação adicional é algo que só deve ser realizado se o autor original do código MATLAB estiver realmente morto ou em coma. Por outro lado, um artigo matemático bem escrito sobre um algoritmo geralmente é muito mais útil do que a implementação do próprio aluno de pós-graduação do autor.
Para facilitar para a pessoa que está portando seu código:
Refatore seu código para garantir que as operações sejam divididas em diferentes funções. O estilo de uma função por arquivo do MATLAB incentiva as funções a serem muito longas e abranger muitas operações. Verifique também se o código duplicado é extraído para as funções auxiliares, mesmo que isso resulte em mais arquivos do que você normalmente gostaria de trabalhar para um projeto MATLAB.
Explique quaisquer números mágicos ou constantes usados no seu código e as condições sob as quais eles são válidos.
Documente as estruturas de dados do seu código. O estilo "tudo é uma matriz" do MATLAB é muito diferente da maioria das linguagens, e muitas vezes significa que suas estruturas de dados são definidas implicitamente pela maneira como você utiliza as matrizes. O programador de CA precisará descobrir como configurar as várias estruturas e alocar as matrizes necessárias, para garantir que esteja claro quais são os significados e as estruturas internas de suas variáveis.
Documente os algoritmos usados pelo seu código. Em particular, verifique se está claro o que acontece quando você usa funções e operadores complicados de matriz inteira e se o programador C tem acesso a referências sobre os algoritmos usados por quaisquer funções da caixa de ferramentas ou funções da biblioteca padrão que são mais complicadas do que Funções BLAS.
Documente tudo o que você fez para tornar o código robusto, como validação de entrada e tratamento de erros. A maneira como você o implementou provavelmente é muito diferente de como isso deve ser feito em C. Os acadêmicos que escrevem o código MATLAB raramente se preocupam em aprender sobre coisas como o tratamento de exceções. Se você não fez nada para tornar seu código robusto, pelo menos documente o que poderia ser feito sobre entradas inválidas ou dados parciais ou defeituosos.
Certifique-se de que a pessoa que está portando o código possa comparar a saída com o código MATLAB original e, se possível, forneça um conjunto completo de testes de entrada e saída correta.
Se a pessoa que faz a portabilidade não conhece a análise numérica, será necessário supervisionar o processo de portabilidade e verificar e compreender o código C. Será muito educativo para vocês dois.
fonte
Linguagens de programação são muito mais fáceis de ler do que escrever. A maioria dos programadores em C com um mínimo de experiência deve ser capaz de ler bem o seu código Matlab com acesso a uma referência e, especialmente, com acesso a um programador Matlab para responder às suas perguntas. Código de qualquer tipo é muito menos ambíguo do que a maioria dos requisitos nos quais temos que trabalhar.
Se tiverem um diploma de bacharel em ciência da computação ou engenharia de computação, provavelmente terão cursado cálculo, trigonometria e álgebra linear, mas pode estar enferrujado. A menos que eles façam muita programação científica / matemática, a maioria dos programadores em C saberá o que é uma FFT, mas raramente ou nunca precisou fazer uma. Seu candidato ideal terá tudo isso em mente, mas qualquer pessoa com diploma deve ser capaz de lidar com a matemática com algum estudo de atualização. Em ambos os casos, você deseja alguém que enfatize a localização de bibliotecas existentes para operações comuns como essa sempre que possível, em vez de criar suas próprias.
O talento para otimizar o tempo de execução do algoritmo varia muito, mesmo entre programadores experientes. Eu recomendaria que você tivesse um problema de entrevista para descobrir isso. Mostre aos candidatos um algoritmo simples, mas intencionalmente ineficiente, e pergunte o que eles fazem. Veja se eles trazem sua ineficiência por conta própria. Pergunte a eles qual é a complexidade assintótica e qual deve ser. Pergunte a eles como eles reescreveriam para melhorar a eficiência.
fonte
A razão financeira para não usar o compilador matlab é bem compreensível. No entanto, você pode usar o conversor gratuito do scilab para C. O procedimento seria
Idealmente, não é necessário nenhum conhecimento do Scilab no processo e é fácil levar algum tempo para tentar esta solução (na prática, talvez não seja tão simples ...)
Nota: Eu não tentei isso, mas é uma solução que me imagino por razões semelhantes.
fonte
Desenvolva um bom conjunto de testes para executar os dois aplicativos e, em seguida, examinar as métricas.
Isso ajudará bastante o desenvolvedor a testar o código e garantir que a qualidade esteja em um nível razoável.
fonte
Ótimo post de Jonas, especialmente o ponto de fornecer uma maneira de testar o código. Aqui estão algumas sugestões adicionais:
Código de compartilhamento. Considere fornecer a fonte MATLAB, mas esteja preparado para explicar sua estrutura ou outros detalhes (da sintaxe ao seu estilo pessoal). Esperamos que o desenvolvedor C reconheça os conceitos, algoritmos e matemática de alto nível ( e espero que você tenha comentado seu código ).
Documentação. Será crucial que você tenha uma documentação clara que defina o projeto; afinal, se a pessoa não é fluente no MATLAB, o código pode não ser uma referência muito útil.
Exercite as habilidades das pessoas. Isso pode ser óbvio, no entanto, é bom ter em mente ao colaborar, especialmente nesse tipo de nível micro. Portanto, você deve tentar remover o máximo de ambiguidade possível do seu código / documentação. Dependendo do seu nível de liderança no projeto, você pode encontrar um equilíbrio entre orientar o desenvolvimento e permitir que a pessoa faça sua própria contribuição individual.
fonte
A menos que seus codificadores C usem as bibliotecas corretas, o Matlab é muito melhor em coisas tão triviais quanto inverter uma matriz. Um ingênuo C impl. não é estável o suficiente. A contratação de codificadores C seria cara. Eu tentaria portar o código do Matlab para analisar e comparar a velocidade, tentar usar o compilador c do Matlab, ou ... apenas jogar mais hardware nele - poderia ser muito mais barato e mais simples, seguro e rápido.
fonte