2009-11-18 19 views
6

^ es el operador exponencial en MATLAB. El problema es que no está presente en muchos diseños de teclado que no están en inglés, y si lo usa mucho en su trabajo, cambiar entre HR y EN se vuelve problemático.¿Cómo hago un carácter "^" en MATLAB?

¿Hay alguna manera de agregarlo a la barra de herramientas de MATLAB (como en Excel, para usarlo con el mouse o el panel táctil) o definir una clave personalizada (por ejemplo, F12) en MATLAB para reemplazarlo?

Estoy esperando una solución que no sea AHK, y similares.

+0

No se trata solo de Matlab. C++/C#/Java usa este operador para bit_xo x. ¿Estás usando Windows? – Mikhail

Respuesta

11

crear un acceso directo barra de herramientas, darle un nombre, y poner lo siguiente en la devolución de llamada:

clipboard('copy','^') 

La ejecución de este colocará el carácter exponente ^ en el portapapeles. Una vez que lo presione, haga un Ctrl + V para pegarlo.

Puede aplicar esta idea para crear una biblioteca de clips de fragmentos accesibles desde el menú de Inicio de MATLAB.

+0

Ahora esto es interesante ... ¿hay alguna manera de integrar Ctrl + V paso en el atajo también? – Rook

+0

Así que al presionarlo, se pega directamente ... – Rook

+0

No tengo miedo, solo lo coloca en el portapapeles (pero luego Ctrl + V es casi un reflejo para mí!) – Amro

6

Sugeriría descargar la presentación EditorMacro de Yair Altman en el MathWorks File Exchange. Si ejecutó el siguiente código en la ventana de comandos de MATLAB (mientras que el editor de MATLAB estaba abierta):

EditorMacro('Alt 6','^'); 

que crearía una macro dentro del marco de la ventana de MATLAB Editor y comandos que insertar la cadena ^ en el posición de intercalación cuando presiona la combinación de teclas Alt + (que, por lo que yo sé, no debería vincularse a ninguna otra macro/operación).

Como mencionas alternar entre un diseño de teclado Croatian y English, probablemente sea molesto tener que memorizar diferentes combinaciones de teclas para los mismos símbolos. Utilizando EditorMacro, podría crear un conjunto de macros en el Editor de MATLAB y en la Ventana de comandos que le permitiría usar el mismo conjunto de teclas para cada símbolo, independientemente del tipo de teclado que esté usando.

Dado que las macros hechas con EditorMacro se eliminan cada vez que se cierra MATLAB, puede crear un startup.m file (que se ejecutará automáticamente cada vez que se abra MATLAB) para crear las macros para usted. El archivo podría ser algo como esto:

edit;      %# Open the Editor so EditorMacro works properly 
EditorMacro('Alt 5','%'); %# Create "%" macro 
EditorMacro('Alt 6','^'); %# Create "^" macro 
EditorMacro('Alt 7','&'); %# Create "&" macro 
... 

En este ejemplo, básicamente estoy reproduciendo el comportamiento de Shift más un número en un teclado Inglés usando Alt lugar.


Y si todo lo demás falla ...

Siempre se puede utilizar el functional forms of the arithmetic operators como último recurso:

  • power(A,B) en lugar de la alimentación de funcionamiento elemento a elemento A.^B
  • mpower(A,B) en lugar de la operación de alimentación de matriz A^B

No será bonito, pero funcionará.

+0

Lo siento, pero eso está fuera de cuestión.Son agradables para ecuaciones más cortas, pero algunas ya son varias como esta ... – Rook

+0

@Idigas: Agregué una nueva solución que puede ser más de tu agrado. ;) – gnovice

+0

De hecho, lo es. En realidad, la idea es lo suficientemente interesante como para ser utilizada para otros fines también. No te daré un + A ya que no sería justo ... pero permíteme, al menos, darte las gracias subiéndote por algunos puntos rep en tus otras respuestas. – Rook

11

En Windows (con función Num Lock), mantenga pulsada la tecla Alt , tipo en el teclado numérico, y liberar Alt.El ^ se insertará en el cursor.

Esta es la técnica general para insertar caracteres Unicode arbitrarios en Windows, independientemente de si están en el teclado.

El carácter ^ es U+5E, que es 94 en decimal.

+0

Guau, me había olvidado de ese truco. +1. – mtrw

+0

No estoy contento con eso tampoco ... en un teclado de computadora portátil, sin un teclado numérico, usar esas combinaciones es un dolor. Aprecio la respuesta, como para que no se entienda erróneamente, es solo que todavía espero que alguien le dé alguna solución * magic * :) – Rook

1

usted podría simplemente utilizar la siguiente identidad matemática:

a^b ≡ exp(b*ln(a)) 

estaba a punto de sugerir el estilo C POWER(A,B) función para reemplazar la funcionalidad del operador ^, pero gnovice se me adelantó. Me imagino que esto es en lo que se basan las funciones POWER(A,B) y MPOWER(A,B).

Como puede ver en las respuestas publicadas, hay muchas alternativas. Es una cuestión de gusto, funcionalidad y repetición.

+1

Sí, bueno ... matlab para principiantes, no tiene ln, pero registra. Segundo, mis expresiones usualmente se ven así: = (c^2/(E * h^3)) * (- (1/8) * R^2 * zetaA^2 * (2 * log (zetaA) -1)) + ... (4 filas a seguir). Así que no creo que vaya a ir con otra cosa que no sea un operador (en términos de la función de alimentación y tal) ... – Rook

+6

sin mencionar los problemas de precisión numérica introducidos por ** log ** y ** exp ** – Amro

3

¿Qué teclado tiene que no esté activado?

http://msdn.microsoft.com/en-us/goglobal/bb964651.aspx

Hicimos una comprobación rápida después de ver esta cuestión, y no pudo encontrar un teclado sin el símbolo.

Habló con nuestro equipo de MATLAB I18N sobre esto y solicitó una mejora.

+0

This fue declarado en la pregunta original. HR = húngaro, me lo imagino. –

+1

No importa. Lo busqué en Google, supongo que es Croation, y puedes obtener el^usando AltGr + 3, ¿o no? –

+0

Sí, es croata (HR = Hrvatska). @Matt - No sabía sobre AltGr + 3. Intento Pero, ¿por qué necesita ser presionada dos veces? Y solo entonces dará dos símbolos ^^? No puedo obtener solo una^en él. – Rook

2

Bien ... Aquí hay un truco que le permite reasignar pulsaciones de teclas arbitrarias en la Ventana de comandos y Editor de Matlab. Este es un truco no compatible que involucra elementos internos no documentados del IDE. Pero es "mágico" como esperabas. Funciona en R2008b y R2009b para mí.

Primero, defina una clase de Java que pueda manejar eventos reemplazándolos con otra entrada de teclado. Compila esto en un JAR y obténgalo en el javaclasspath de Matlab.

package test; 

import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import javax.swing.text.JTextComponent; 
import javax.swing.text.TextAction; 

/** 
* An action that responds to an event with another keystroke. 
*/ 
public class KeyReplacementAction extends TextAction { 

    private final char replacement; 

    /** 
    * @param name Name of this action (ignored in practice) 
    * @param replacement char to replace the event with 
    */ 
    public KeyReplacementAction(String name, char replacement) { 
     super(name); 
     this.replacement = replacement; 
    } 

    public void actionPerformed(ActionEvent e) { 
     if (!(e.getSource() instanceof JTextComponent)) { 
      return; 
     } 
     JTextComponent src = (JTextComponent) e.getSource(); 
     KeyEvent replacementEvent = new KeyEvent(src, KeyEvent.KEY_TYPED, 
       java.lang.System.currentTimeMillis(), 0, 
       KeyEvent.VK_UNDEFINED, replacement); 
     src.dispatchEvent(replacementEvent); 
    } 

} 

Ahora, use el código de Matlab para cavar en aparatos de oscilación del IDE, encontrar los mapas de teclado para la ventana del editor y el mando, y agregar controladores para la reasignación a ellos.

function remap_keys_in_text_areas() 
%REMAP_KEYS_IN_TEXT_AREAS Custom key remapping in Matlab GUI text areas 
% 
% Must be called after the editor is open, otherwise it won't find the 
% editor keymap. 

% { from, to; ... } 
% Try "disp(char(1:1024))" to see all chars that work in your Matlab font 
map = { 
    '$' '^' 
    '#' char(181) % might be useful for text formatting 
    }; 

make_sure_editor_is_open(); % otherwise we won't find its keymap 

keymaps = find_ide_keymaps(); 
for i = 1:size(map,1) 
    [from,to] = map{i,:}; 
    disp(sprintf('Re-binding %s to %s in text areas', from, to)); 
    for j = 1:numel(keymaps) 
     bind_keystroke_for(keymaps{j}, from, to); 
    end 
end 

function make_sure_editor_is_open() 
s = find_editor_widgets(); 
if isempty(s.editors) 
    edit; 
end 

function bind_keystroke_for(keymap, from, to) 
%BIND_KEYSTROKE_FOR Remap a single keystroke in a text component 

import javax.swing.KeyStroke; 
import java.awt.event.InputEvent; 
import test.KeyReplacementAction; 

key = javax.swing.KeyStroke.getKeyStroke(from); 
action = KeyReplacementAction(['remap ' from ' to ' to], to); 
keymap.addActionForKeyStroke(key, action); 

function out = find_ide_keymaps 
%FIND_IDE_KEYMAPS Find keymap objects for Matlab IDE widgets 
set = java.util.HashSet(); 
s = find_editor_widgets(); 
widgets = [s.cmdwin s.editors]; 
for i = 1:numel(widgets) 
    set.add(widgets{i}.getKeymap()); 
end 
set = set.toArray(); 
out = cell(size(set)); 
for i = 1:numel(set) 
    out{i} = set(i); 
end 

function out = find_editor_widgets 
%FIND_EDITOR_WIDGETS Find editor and command window widgets in Matlab Swing GUI 
out.cmdwin = []; 
out.editors = {}; 
wins = java.awt.Window.getOwnerlessWindows(); 
for i = 1:numel(wins) 
    if isa(wins(i), 'com.mathworks.mde.desk.MLMainFrame') 
     out.cmdwin = get_command_window_from_mainframe(wins(i)); 
    elseif isa(wins(i), 'com.mathworks.mde.desk.MLMultipleClientFrame') 
     out.editors = [out.editors get_text_areas_from_editor_frame(wins(i))]; 
    end 
end 

function out = get_command_window_from_mainframe(frame) 
out = findobj_swing_widget(frame, 'com.mathworks.mde.cmdwin.XCmdWndView'); 

function out = get_text_areas_from_editor_frame(frame) 
out = findobj_swing_widget(frame, 'com.mathworks.widgets.SyntaxTextPane'); 

function out = findobj_swing_widget(widget, klass) 
%FINDOBJ_SWING_WIDGET Recursively find all child components of given class 
out = {}; 
if isa(widget, klass) 
    out{end+1} = widget; 
end 
for i = 1:widget.getComponentCount() 
    out = [out findobj_swing_widget(widget.getComponent(i-1), klass)]; 
end 

Para activar las reasignaciones, simplemente llame a la función. Puede hacer esto desde startup.m para que suceda automáticamente.

 
>> remap_keys_in_text_areas 
Re-binding $ to^in text areas 
Re-binding # to µ in text areas 
Cuestiones relacionadas